Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是容器的迭代器end()_C++_Stl_Iterator - Fatal编程技术网

C++ 是容器的迭代器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()迭代器,因此无法进

如果没有容器本身,是否有方法检查迭代器(作为参数“last”传递给函数)是否等于end()

template<typename ForwardIterator>
void MyFunc(ForwardIterator first, ForwardIterator last) {
...
}
模板
void MyFunc(首先是ForwardIterator,最后是ForwardIterator){
...
}

AFAIK-否。如果没有容器,则无法获取::end()迭代器,因此无法进行比较。为什么不将容器作为参考传递

退房:

正常情况下,<代码> MyFunc 应考虑包括<代码>第一< /代码>和排除<代码>最后< /代码>,正如标准算法所做的那样。

这是在标准库中完成的,其确切原因(或问题)是您正在声明的。对算法函数的典型调用,例如整个容器看起来像
algoname(foo.begin(),foo.end())
where
foo.end()
是一个迭代器,它指向最后一个有效元素之后的无效元素。 因此,算法需要以某种方式知道它是否可以取消引用任何给定的迭代器(或者至少是
last
中给定的迭代器)


另一方面,通过定义
last
是独占的,可以完全避免这个问题。因此,例如,可以按照(…it!=last)的
对元素进行迭代,并且相同的代码将适用于
last
的任何值,这两个值都引用有效对象,并且由
end()
返回。实现需要确保的唯一一件事是
first
MyFunc
不需要知道
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。我会添加条件。谢谢