2013-02-21 160 views
2

我認爲迭代器對象的想法是,您可以將它類似地應用於C++容器類。但是,當我嘗試遍歷列表對象時,我嘗試使用C++:列表迭代器與矢量迭代器

for(list<int>::iterator it = obj.begin(); it < obj.end(); it++){ 
    // some code 
} 

而且出現錯誤。爲什麼這不起作用?爲什麼它會爲vector::iterator工作?僅僅是因爲列表的實現是雙向鏈表?我認爲迭代器對象抽象出在容器中移動的概念,從而使它在操作上可以相同,無論是向量還是列表。

我真的很感謝澄清。

+1

neagoegab 2013-02-21 15:48:34

+0

什麼錯誤?編譯器會告訴你什麼? – sth 2013-02-21 15:50:24

回答

7

這不起作用,因爲迭代器不像std::vectorstd::list迭代器不是隨機訪問 - 它們是順序的。你需要對他們使用!=

for(list<int>::iterator it = obj.begin(); it != obj.end(); it++) 

在一般情況下,這是一個好主意,當你正在尋找覆蓋整個範圍,即使這些迭代器允許使用「不等於」所有的迭代器<比較和>。也有人贊成在你的常規for循環中使用!=,因爲它給了你最強的postcondition

1

您必須與!=進行比較,因爲列表迭代器以隨機順序遍佈所有內存。

用途:for(list<int>::iterator it = obj.begin(); it != obj.end(); it++)

0

這是因爲list不支持隨機訪問迭代器,但只有向前迭代器。因此,operator <未定義爲list的迭代器。您必須使用operator !=進行不等式比較。

0

只爲隨機訪問迭代器定義了運算符算術,包括排序比較運算符(如<)。如果您更改代碼以使用!=,它會工作(假設objlist<int>):

for(list<int>::iterator it = obj.begin(); it != obj.end(); it++){ 
    // some code 
}