您正在假设迭代器是访问容器的一种方式。它们允许您这样做,但它们也允许更多显然不适合您预期操作的事情:
auto it = std::find(std::begin(x), std::next(std::begin(x),10), 42 );
// Is 42 among the first 10 elements of 'x'?
auto it = std::find(std::istream_iterator<int>(std::cout),
std::istream_iterator<int>(), 42 );
// Is 42 one of the numbers from standard input?
在第一种情况下,迭代器确实引用了一个容器,但是您找到的范围并未包含整个容器,因此it
无法针对end(x)
. 在第二种情况下,根本没有容器。
请注意,许多容器的迭代器的有效实现只包含一个指针,因此任何其他状态都会增加迭代器的大小。
关于到任何类型的转换or bool
,它们确实会引起很多问题,但是在 C++11 中可以通过explicit
转换来规避它们,或者在 C++03 中使用安全布尔成语。
您可能对不同的概念更感兴趣:范围。范围有多种方法,因此尚不清楚确切的语义应该是什么。想到的前两个是 Boost.Iterator 和我最近阅读的 Alexandrescu 的一篇文章On Iteration。