2010-11-03 34 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

相關問題