有没有办法检查迭代器(传递给函数作为参数" last")等于end(),以防我没有容器本身?
template<typename ForwardIterator>
void MyFunc(ForwardIterator first, ForwardIterator last) {
...
}
答案 0 :(得分:1)
AFAIK - 没有。如果您没有容器,则无法获得:: end()迭代器,因此您无法进行比较。为什么不将容器作为参考传递?
答案 1 :(得分:1)
通常,MyFunc
应该考虑包括first
和排除 last
的范围,就像标准算法一样。
在标准库中,您正在说明的确切原因(或问题)。对算法函数的典型调用,例如整个容器看起来像algoname(foo.begin(), foo.end());
,其中foo.end()
是一个迭代器,指向最后一个有效的之后的无效元素。
因此,算法需要以某种方式知道它是否可以取消引用任何给定的迭代器(或者至少是last
中给出的迭代器)。
另一方面,通过定义last
是独占的,完全避免了这个问题。因此,例如迭代元素可以用for(... it != last)
完成,这个相同的代码适用于任何和 {/ 1>的每个值},两个引用有效对象,以及last
返回的对象。实现需要确保的唯一事情是end()
,没有什么可以出错。