2010-04-28 53 views
26

帶迭代器的代碼看起來非常像帶指針的代碼。迭代器是一些不明顯的類型(例如std::vector<int>::iterator)。迭代器和指針如何相關?

我沒有得到的是迭代器和指針是如何相互關聯的 - 迭代器是一個包裝指針的重載操作的指針,以推進到相鄰元素還是其他東西?

回答

44

迭代器是指針的泛化。

迭代器(取決於變體)具有與實施*和++

因此,一個指針是一個迭代。但不一定是相反的。

如果你想迭代一個複雜的結構(一棵樹,一個圖...),迭代器將遠不止一個指針,並且不會引用RAM中的某個實際位置。

+7

我們可以說指針是迭代器的子集嗎? – solti 2014-09-11 22:37:03

+7

是的,絕對的 – 2014-09-12 09:44:37

7

概念上,是的 - 但它們不需要是指針。他們的內部和功能將取決於他們「包裝」的數據結構。

這就是爲什麼有不同的"classes" of iterators。例如。單向,雙向,隨機訪問等。

一些能夠多個類。

E.g.如果內部結構是紅黑樹或鏈接列表,則迭代器可能是雙向的,但不是隨機訪問。如果它們包裝一個向量(作爲一個數組實現),你將擁有RandomAccess和Bidirectional。

7

迭代器是重載某些操作符的對象,所以用法看起來像是指針。這在給定迭代器類別的能力範圍內。隨機訪問迭代器看起來完全像指針,其他類型的迭代器不提供某些操作(例如,list<X>::iterator是雙向的,在許多其他需要隨機訪問的操作系統中沒有運算符+=)。

至於「晦澀名稱」時,它是不能完全不可想象使用一個普通的指針爲一個迭代:

template <class T> 
class MyContainer 
{ 
    ... 
    typedef T* iterator; 
} 

MyContainer<int>::iterator it; //the type is really int* 
3

迭代器就是提供用於迭代所需的接口的一個概念 - 這些都是不同用於不同類型的迭代器,並在C++標準的第24.1節(迭代器要求)中進行了規定。

如何實現迭代器取決於它們遍歷的內容 - 對於向量,它們通常是指向數組的單個指針的包裝(無論如何都是在發佈版本中),對於更復雜的容器,它們具有更復雜的實現。對於開放式範圍,它們將包含用於生成元素的任何算法的狀態。

請注意,指向數組元素的指針滿足隨機訪問迭代器的要求,因此它們在某種程度上可以互換。

+2

我認爲這個詞是* concept *而不是* type *在這裏。 – 2010-04-28 10:14:36