【问题标题】:Size of unknown container, vector or array c++未知容器、向量或数组c ++的大小
【发布时间】:2017-07-19 14:44:20
【问题描述】:

我尝试构建一个模板函数,该函数获取 vectorarray 的 2 个迭代器(beginend)(这必须是传递给函数的未知容器)。

  1. 我希望该函数检查传递给它的容器的大小。 我的问题是:如果 begin iterator 等于 end iterator 是否意味着容器内有 0 个或 1 个元素? 我怎样才能 decalare 一些通用尺寸类型?

  2. 如果我想通过将迭代器传递给排序函数来对未知容器进行排序,这会成为问题吗?我觉得它不会起作用。

这是我的模板函数草稿:

    template<class P, class T>
    T my_func(P beg, P end)
    {
       typedef typename ??? container_size;
       if (beg == end)//first problem to determine if contains 0 or 1 
                         elements 

       throw domain_error("some message if 0 elements");

       sort(beg, end);// scond problem

    }

【问题讨论】:

  • std::distancebegin == end size == std::distance(begin, end) == 0.
  • begin 等于 end 表示容器为空
  • C++ 标准库迭代器总是使用开始迭代器包含且结束迭代器排他的方案(指的是过去的结束)。

标签: c++ arrays vector


【解决方案1】:
  1. 我希望该函数检查传递给它的容器的大小。我的问题是:如果开始迭代器等于结束迭代器,这是否意味着容器内有 0 个或 1 个元素?我怎样才能 decalare 一些通用尺寸类型?

您应该为此使用std::distance

  1. 如果我想通过将迭代器传递给排序函数来对未知容器进行排序,这会成为问题吗?我觉得它行不通。

只要迭代器是RandomAccessIterators,值类型是swappable,它就可以工作


所以,您的代码可能是:

template<class P, class T>
T my_func(P first, P last)
{
   if(first == last) // No elements within the range
        throw domain_error("some message if 0 elements");

   //Number of Elements within the range
   auto container_size = std::distance(first, last);

   std::sort(first, last);

   return ...;
}

如果我的猜测是正确的,模板参数T应该是迭代器的值类型,你可以使用std::iterator_traits&lt;T&gt;::value_type获取它

【讨论】:

  • 这是一个简短、准确和可靠的答案。我想看到更多这样的。很棒。
  • @WhiZTiM 如果容器在内存中不是连续的,那么距离函数怎么知道容器中每个元素有多少字节?
  • @axcelenator distance 会尝试类似for(; first != last; first++) n++;
  • @axcelenator 迭代器为您抽象出operator++,以便增量始终有效,这就是迭代器的重点。
  • @axcelenator。 2 of 2:如果您查看std::distance,如果迭代器是RandomAccess,它将为您提供O(1) 中数据结构中的元素数量,否则,它将需要增加第一个参数直到达到最后一个;这意味着让迭代器做“任何工作”是必要的(被operator++抽象出来)去下一个元素直到到达最后一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2020-11-13
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多