2010-11-03 58 views
4
// display vector elements using const_iterator 
    for (constIterator = integers.begin(); 
     constIterator != integers.end(); ++constIterator) 
     cout << *constIterator << ' '; 

我们可以用constIterator < integers.end()吗?C++ - STL Vector :: const_iterator为什么不使用<xx.end()?

谢谢

+0

您的问题标题提供了一个好评:“为什么使用'''xx.end()” - 为什么?!?当我们已经在处理迭代器时''='看起来非常好。 (与索引相反,'<'有时候是有道理的。) – 2010-11-03 20:39:00

+0

缓存end()是一个好主意,而不是在整个循环中调用它。 – 2010-11-03 20:41:39

+0

@Martin:我在这里看不到索引和迭代器之间的真正区别。 (基本上,他们唯一的区别在于如何访问被引用的元素。)有一个想法,创造了_defensive programming_,它倾向于'<' and '>'以上(或曾经是,我不知道发生了什么) '=='和'!='。请参阅[我的答案](http://stackoverflow.com/questions/4091380/4091557#4091557)。 – sbi 2010-11-03 20:56:02

回答

8

operator<只定义为random access iterators。例如,通过std::vectorstd::string提供了这些容器,实质上,它们将数据存储在连续存储器中,其中迭代器通常不过是被包装的指针。由例如std::list提供的迭代器仅为bidirectional iterators,其仅提供对等的比较。

传统上,它被视为防御性编程使用<而不是!=。如果发生错误(例如,某人更改++ii+=2),即使永远不会达到确切的最终值,循环也会终止。然而,另一种观点是它可能会掩盖一个错误,而循环无休止地运行或导致崩溃会使错误变得明显。

+0

如果'i'增加超过'结束()'? – UncleBens 2010-11-03 21:29:40

+0

@UncleBens:是的,对于迭代器来说,这将是_UB_。我指的是这样做的总体思路。认为“索引”。 – sbi 2010-11-03 21:40:43

+0

这不是指针的UB - 不指向NULL,任何有效的对象或“刚过去”任何有效的对象? – 2010-11-03 21:45:22

7

是的,你也可以使用运营商<为双端队列::(const_)迭代器,但它不会对迭代器用于任何其它容器的工作。

运算符<的工作是有保证的,因为vector和deque提供了一个随机访问迭代器。

+0

你好马丁,或者我们可以说<为矢量b/c矢量使用连续记忆吗? – q0987 2010-11-03 21:19:04

+2

这就是*它如何工作的载体(迭代器只是一个指针),但不是它如何为deque工作(我相当确信deques是不连续的)。 – 2010-11-03 21:21:57

+0

Deques将数据存储在块中,因此存储在_almost_连续内存中。这就是为什么他们可以提供随机访问迭代器。 – sbi 2010-11-04 05:48:08

相关问题