C++ STL迭代器使用詳解
寫在前面,迭代器這種東西,就是為了使訪問簡單!!
容器::iterator iter;
for(iter= 容器.begin();iter!=容器.end();iter++){
cout<<*iter或者是 iter->first等等之類的 //迭代器就是這麼個套路
}
然後就是set,set就是一個集合,僅此而已,而其他的,像是map比較有意思,提供了兩種資料結構的對應,而其他的我們不要簡單的認為是佇列和棧,我們要認為這是一種容器,能夠包含多種資料結構,用了這種思想,我們就會想的更明白
下面給出摘抄下來的正文:
指標與陣列
指標與其它資料結構呢?比如說連結串列?
儲存空間是非連續的。不能通過對指向這種資料結構的指標做累加來遍歷。
能不能提供一個行為類似指標的類,來對非陣列的資料結構進行遍歷呢?這樣我們就能夠以同樣的方式來遍歷所有資料結構(容器)。
迭代器(Iterator)是指標(pointer)的泛化,它允許程式設計師以相同的方式處理不同的資料結構(容器)。STL中有五種型別的迭代器,它們分別滿足一定的要求。不同的迭代器要求定義的操作不一樣。
箭頭表示左邊的迭代器一定滿足右邊迭代器需要的條件。
下面的圖表畫出了這幾種:
input output
\/
forward
|
bidirectional
|
random access
要注意,上面這圖表並不是表明它們之間的繼承關係:而只是描述了迭代器的種類和介面。處於圖表下層的迭代器都是相對於處於圖表上層迭代器的擴張集。例如:forward迭代器不但擁有input和output迭代器的所有功能,還擁有更多的功能。
比如某個演算法需要一個雙向迭代器(Bidirctional Iterator),你可以把一個任意存取迭代器(Random Access Iterator)作為引數;但反之不行。
迭代器iterator 提供了一種一般化的方法對順序或關聯容器型別中的每個元素進行連續訪問
例如,假設iter為任意容器型別的一個iterator,則++iter 表示向前移動迭代器使其指向容器的下一個元素,而*iter 返回iterator 指向元素的值,每種容器型別都提供一個begin()和一個end()成員函式。
begin()返回一個iterator 它指向容器的第一個元素
end()返回一個iterator 它指向容器的末元素的下一個位置
通過迭代器,我們可以用相同的方式來訪問、遍歷容器。
不同容器提供自己的迭代器,所以不同迭代器具有不同的能力。
迭代器的作用:
- 能夠讓迭代器與演算法不干擾的相互發展,最後又能無間隙的粘合起來。
- 過載了*,++,==,!=,=運算子。用以操作複雜的資料結構。
- 容器提供迭代器,演算法使用迭代器。
各個迭代器的功能如下:
迭代器類別 |
說明 |
輸入 |
從容器中讀取元素。輸入迭代器只能一次讀入一個元素向前移動,輸入迭代器只支援一遍演算法,同一個輸入迭代器不能兩遍遍歷一個序列 |
輸出 |
向容器中寫入元素。輸出迭代器只能一次一個元素向前移動。輸出迭代器只支援一遍演算法,統一輸出迭代器不能兩次遍歷一個序列 |
正向 |
組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置 |
雙向 |
組合正向迭代器和逆向迭代器的功能,支援多遍演算法 |
隨機訪問 |
組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素 |
迭代器的操作:
每種迭代器均可進行包括表中前一種迭代器可進行的操作。
迭代器操作 |
說明 |
所有迭代器 |
|
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物件建立了一個排序佇列 |
下面列舉了些例子說明各個容器的用法:
1、vector
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
2、deque
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
3、list
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
4、set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
5、multiset
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
6、map
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
7、multimap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
|
8、stack
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
9、queue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
10、priority_queue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
指標與陣列
指標與其它資料結構呢?比如說連結串列?
儲存空間是非連續的。不能通過對指向這種資料結構的指標做累加來遍歷。
能不能提供一個行為類似指標的類,來對非陣列的資料結構進行遍歷呢?這樣我們就能夠以同樣的方式來遍歷所有資料結構(容器)。
迭代器(Iterator)是指標(pointer)的泛化,它允許程式設計師以相同的方式處理不同的資料結構(容器)。STL中有五種型別的迭代器,它們分別滿足一定的要求。不同的迭代器要求定義的操作不一樣。
箭頭表示左邊的迭代器一定滿足右邊迭代器需要的條件。
下面的圖表畫出了這幾種:
input output
\/
forward
|
bidirectional
|
random access
要注意,上面這圖表並不是表明它們之間的繼承關係:而只是描述了迭代器的種類和介面。處於圖表下層的迭代器都是相對於處於圖表上層迭代器的擴張集。例如:forward迭代器不但擁有input和output迭代器的所有功能,還擁有更多的功能。
比如某個演算法需要一個雙向迭代器(Bidirctional Iterator),你可以把一個任意存取迭代器(Random Access Iterator)作為引數;但反之不行。
迭代器iterator 提供了一種一般化的方法對順序或關聯容器型別中的每個元素進行連續訪問
例如,假設iter為任意容器型別的一個iterator,則++iter 表示向前移動迭代器使其指向容器的下一個元素,而*iter 返回iterator 指向元素的值,每種容器型別都提供一個begin()和一個end()成員函式。
begin()返回一個iterator 它指向容器的第一個元素
end()返回一個iterator 它指向容器的末元素的下一個位置
通過迭代器,我們可以用相同的方式來訪問、遍歷容器。
不同容器提供自己的迭代器,所以不同迭代器具有不同的能力。
迭代器的作用:
- 能夠讓迭代器與演算法不干擾的相互發展,最後又能無間隙的粘合起來。
- 過載了*,++,==,!=,=運算子。用以操作複雜的資料結構。
- 容器提供迭代器,演算法使用迭代器。
各個迭代器的功能如下:
迭代器類別 |
說明 |
輸入 |
從容器中讀取元素。輸入迭代器只能一次讀入一個元素向前移動,輸入迭代器只支援一遍演算法,同一個輸入迭代器不能兩遍遍歷一個序列 |
輸出 |
向容器中寫入元素。輸出迭代器只能一次一個元素向前移動。輸出迭代器只支援一遍演算法,統一輸出迭代器不能兩次遍歷一個序列 |
正向 |
組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置 |
雙向 |
組合正向迭代器和逆向迭代器的功能,支援多遍演算法 |
隨機訪問 |
組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素 |
迭代器的操作:
每種迭代器均可進行包括表中前一種迭代器可進行的操作。
迭代器操作 |
說明 |
所有迭代器 |
|
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物件建立了一個排序佇列 |
下面列舉了些例子說明各個容器的用法:
1、vector
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
2、deque
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
3、list
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|