C++ 是容器的迭代器end()
如果没有容器本身,是否有方法检查迭代器(作为参数“last”传递给函数)是否等于end()C++ 是容器的迭代器end(),c++,stl,iterator,C++,Stl,Iterator,如果没有容器本身,是否有方法检查迭代器(作为参数“last”传递给函数)是否等于end() template<typename ForwardIterator> void MyFunc(ForwardIterator first, ForwardIterator last) { ... } 模板 void MyFunc(首先是ForwardIterator,最后是ForwardIterator){ ... } AFAIK-否。如果没有容器,则无法获取::end()迭代器,因此无法进
template<typename ForwardIterator>
void MyFunc(ForwardIterator first, ForwardIterator last) {
...
}
模板
void MyFunc(首先是ForwardIterator,最后是ForwardIterator){
...
}
AFAIK-否。如果没有容器,则无法获取::end()迭代器,因此无法进行比较。为什么不将容器作为参考传递
退房:
正常情况下,<代码> MyFunc 应考虑包括<代码>第一< /代码>和排除<代码>最后< /代码>,正如标准算法所做的那样。
这是在标准库中完成的,其确切原因(或问题)是您正在声明的。对算法函数的典型调用,例如整个容器看起来像algoname(foo.begin(),foo.end())
wherefoo.end()
是一个迭代器,它指向最后一个有效元素之后的无效元素。
因此,算法需要以某种方式知道它是否可以取消引用任何给定的迭代器(或者至少是last
中给定的迭代器)
另一方面,通过定义
last
是独占的,可以完全避免这个问题。因此,例如,可以按照(…it!=last)的对元素进行迭代,并且相同的代码将适用于last
的任何值,这两个值都引用有效对象,并且由end()
返回。实现需要确保的唯一一件事是firstMyFunc
不需要知道last
是否是任何给定容器的结尾,如果它是,那么您可能应该重新考虑它的设计。因此,您要问的是,是否可以与您没有的值进行比较?否,OP询问迭代器本身是否可以确定它是否等于OP没有的值。上面的代码甚至无法确定迭代器是否是容器!从<代码> STD::IFStuts中考虑流迭代器。一般来说,迭代器可以是很多东西。给定int-arr[7]
,然后arr
和arr+7
是有效的迭代器。尝试以stl样式编写算法,获取序列的第一个和最后一个迭代器,在这种情况下,您应该使用last作为序列的结尾last不应该是序列的结尾。它应该是指向您希望由算法处理的范围内最后一个元素的迭代器。换句话说,如果您想将迭代器传递到末尾,那么就传递,但不要强制传递。在stl描述中,我通常会看到:“…范围[first,last…”,这意味着“last”元素未包含在算法逻辑中?实际上,我正在编写一个学习任务来实现经典排序算法,例如对于冒泡排序:模板void BubbleSort(BidirectionalIterator first,BidirectionalIterator last){而(first!=--last)for(BidirectionalIterator iter2=first;iter2!=last;++iter2)如果(*iter2>*(iter2+1))std::swap(*iter2,*(iter2+1));它在迭代方面看起来可以吗?因为你减少了last
,你需要确保first!=last
(first==last
对于排序是没有意义的,但仍然是合法的)。此外,对于该循环,您需要last>first
。因此总共缺少一个=
检查。而first>last
没有意义,并且根据您的API合同是不合法的(给定名称为“first”和“last”),做错事不应该导致代码陷入无限循环。因此,我不能首先使用last>,因为假设迭代器是双向的,而不是随机访问(不幸的是,这是真的),所以在这种情况下,最好使用相等来防止空范围(你不能保护自己不受反向范围的影响).是的,我明白了,唯一安全的问题是first==last initially。我会添加条件。谢谢