是容器的iterator end()

时间:2015-03-20 09:48:49

标签: c++ stl iterator

有没有办法检查迭代器(传递给函数作为参数" last")等于end(),以防我没有容器本身?

template<typename ForwardIterator>
void MyFunc(ForwardIterator first, ForwardIterator last) {
...
}

2 个答案:

答案 0 :(得分:1)

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

退房: Testing whether an iterator points to the last item?

答案 1 :(得分:1)

通常,MyFunc应该考虑包括first排除 last的范围,就像标准算法一样。

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

另一方面,通过定义last是独占的,完全避免了这个问题。因此,例如迭代元素可以用for(... it != last)完成,这个相同的代码适用于任何 {/ 1>的每个值},两个引用有效对象,以及last返回的对象。实现需要确保的唯一事情是end(),没有什么可以出错。