c++迭代器的學習
C++迭代器是一種檢查容器內元素並遍歷元素的資料型別。標準庫為每一種標準容器(包括 vector)定義了一種迭代器型別。迭代器型別提供了比下標操作更通用化的方法:所有的標準庫容器都定義了相應的迭代器型別,而只有少數的容器支援下標操作。因為迭代器對所有的容器都適用,現代 C++ 程式更傾向於使用迭代器而不是下標操作訪問容器元素,即使對支援下標操作的 vector 型別也是這樣。這樣帶來的好處是在STL設計演算法時,可以脫離容器而設計更加通用的演算法。比如,在容器中查詢一個元素。查詢,這個操作一般來說就是遍歷整個集合,然後找到那個要找的元素,但是,如果沒有迭代器,我們需要為vector和List設計兩個查詢演算法,因為找下一個元素在vector和List中的操作不同。同樣的思想卻要兩套程式碼,顯然這是不優秀的。
C++的指標也是一種迭代器。但是,迭代器不僅僅是指標,因此你不能認為他們一定具有地址值。例如,一個數組索引,也可以認為是一種迭代器。有了模板,我們可以將演算法和特定的資料分離開來,而有了迭代器,我們可以將演算法和特定的容器分離開來。
例如
vector<int>::iterator iter;這條語句定義了一個名為iter的變數,它的資料型別是由vector<int>定義的iterator型別。
標準模板庫(The Standard Template Library, STL)定義了五種迭代器。下面的圖表畫出了這幾種:
input output
\ /
forward
|
bidirectional
|
random access
Input iterators提供對資料的只讀訪問。
Output iterators提供對資料的只寫訪問
Forward iterators提供讀寫操作,並能向前推進迭代器。
Bidirectional iterators提供讀寫操作,並能向前和向後操作。
Random access iterators提供讀寫操作,並能在資料中隨機移動。
各個迭代器的功能如下:
迭代器類別 |
說明 |
輸入 |
從容器中讀取元素。輸入迭代器只能一次讀入一個元素向前移動,輸入迭代器只支援一遍演算法,同一個輸入迭代器不能兩遍遍歷一個序列 |
輸出 |
向容器中寫入元素。輸出迭代器只能一次一個元素向前移動。輸出迭代器只支援一遍演算法,統一輸出迭代器不能兩次遍歷一個序列 |
正向 |
組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置 |
雙向 |
組合正向迭代器和逆向迭代器的功能,支援多遍演算法 |
隨機訪問 |
組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素 |
迭代器的操作:
每種迭代器均可進行包括表中前一種迭代器可進行的操作。
迭代器操作 |
說明 |
所有迭代器 |
|
p++ |
後置自增迭代器 |
++p |
前置自增迭代器 |
輸入迭代器 |
|
*p |
復引用迭代器,作為右值 |
p=p1 |
將一個迭代器賦給另一個迭代器 |
p==p1 |
比較迭代器的相等性 |
p!=p1 |
比較迭代器的不等性 |
輸出迭代器 |
|
*p |
復引用迭代器,作為左值 |
p=p1 |
將一個迭代器賦給另一個迭代器 |
正向迭代器 |
提供輸入輸出迭代器的所有功能 |
雙向迭代器 |
|
--p |
前置自減迭代器 |
p-- |
後置自減迭代器 |
隨機迭代器 |
|
p+=i |
將迭代器遞增i位 |
p-=i |
將迭代器遞減i位 |
p+i |
在p位加i位後的迭代器 |
p-i |
在p位減i位後的迭代器 |
p[i] |
返回p位元素偏離i位的元素引用 |
p<p1 |
如果迭代器p的位置在p1前,返回true,否則返回false |
p<=p1 |
p的位置在p1的前面或同一位置時返回true,否則返回false |
p>p1 |
如果迭代器p的位置在p1後,返回true,否則返回false |
p>=p1 |
p的位置在p1的後面或同一位置時返回true,否則返回false |
只有順序容器和關聯容器支援迭代器遍歷,各容器支援的迭代器的類別如下:
容器 |
支援的迭代器類別 |
說明 |
vector |
隨機訪問 |
一種隨機訪問的陣列型別,提供了對陣列元素進行快速隨機訪問以及在序列尾部進行快速的插入和刪除操作的功能。可以再需要的時候修改其自身的大小 |
deque |
隨機訪問 |
一種隨機訪問的陣列型別,提供了序列兩端快速進行插入和刪除操作的功能。可以再需要的時候修改其自身的大小 |
list |
雙向 |
一種不支援隨機訪問的陣列型別,插入和刪除所花費的時間是固定的,與位置無關。 |
set |
雙向 |
一種隨機存取的容器,其關鍵字和資料元素是同一個值。所有元素都必須具有惟一值。 |
multiset |
雙向 |
一種隨機存取的容器,其關鍵字和資料元素是同一個值。可以包含重複的元素。 |
map |
雙向 |
一種包含成對數值的容器,一個值是實際資料值,另一個是用來尋找資料的關鍵字。一個特定的關鍵字只能與一個元素關聯。 |
multimap |
雙向 |
一種包含成對數值的容器,一個值是實際資料值,另一個是用來尋找資料的關鍵字。一個關鍵字可以與多個數據元素關聯。 |
stack |
不支援 |
介面卡容器型別,用vector,deque或list物件建立了一個先進後出容器 |
queue |
不支援 |
介面卡容器型別,用deque或list物件建立了一個先進先出容器 |
priority_queue |
不支援 |
介面卡容器型別,用vector或deque物件建立了一個排序佇列 |