STL中迭代器的分類
五類迭代器如下:
1、輸入迭代器:只讀,一次傳遞
為輸入迭代器預定義實現只有istream_iterator和istreambuf_iterator,用於從一個輸入流istream中讀取。一個輸入迭代器僅能對它所選擇的每個元素進行一次解析,它們只能向前移動。一個專門的建構函式定義了超越末尾的值。總是,輸入迭代器可以對讀操作的結果進行解析(對每個值僅解析一次),然後向前移動。
2、輸出迭代器:只寫,一次傳遞
這是對輸入迭代器的補充,不過是寫操作而不是讀操作。為輸出迭代器的預定義實現只有ostream_iterator和ostreambuf_iterator,用於向一個輸出流ostream寫資料,還有一個一般較少使用的raw_storage_iterator。他們只能對每個寫出的值進行一次解析,並且只能向前移動。對於輸出迭代器來說,沒有使用超越末尾的值來結束的概念。總之,輸出迭代器可以對寫操作的值進行解析(對每一個值僅解析一次),然後向前移動。
3、前向迭代器:多次讀/寫
前向迭代器包含了輸入和輸出迭代器兩者的功能,加上還可以多次解析一個迭代器指定的位置,因此可以對一個值進行多次讀/寫。顧名思義,前向迭代器只能向前移動。沒有為前向迭代器預定義迭代器。
4、雙向迭代器:operator--
雙向迭代器具有前向迭代器的全部功能。另外它還可以利用自減操作符operator--向後一次移動一個位置。由list容器中返回的迭代器都是雙向的。
5、隨機訪問迭代器:類似於一個指標
隨機訪問迭代器具有雙向迭代器的所有功能,再加上一個指標所有的功能(一個指標就是一個隨機訪問迭代器),除了沒有一種“空(null)”迭代器和空指標對應。基本上可以這樣說,一個隨機訪問迭代器就像一個指標那樣可以進行任何操作,包括使用操作符operator[]進行索引,加某個數值到一個指標就可以向前或者向後移動若干個位置,或者使用比較運算子在迭代器之間進行比較。
迭代器類別 |
說明 |
輸入迭代器 |
從容器中讀取元素。輸入迭代器只能一次讀入一個元素向前移動,輸入迭代器只支援一遍演算法,同一個輸入迭代器不能兩遍遍歷一個序列 |
輸出迭代器 |
向容器中寫入元素。輸出迭代器只能一次一個元素向前移動。輸出迭代器只支援一遍演算法,統一輸出迭代器不能兩次遍歷一個序列 |
正向迭代器 |
組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置 |
雙向迭代器 |
組合正向迭代器和逆向迭代器的功能,支援多遍演算法 |
隨機訪問迭代器 |
組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素 |
迭代器的操作:
每種迭代器均可進行包括表中前一種迭代器可進行的操作。迭代器的操作本質上是通過過載運算子來實現的,迭代器支援何種操作和能夠執行什麼運算是由迭代器所過載的運算子來決定的。
迭代器型別 | 操作型別 | 說明 |
所有迭代器 |
p++ ++p |
後置自增迭代器 前置自增迭代器s's |
輸入迭代器 |
*p p=p1 p==p1 p!=p1 |
復引用迭代器,作為右值 將一個迭代器賦給另一個迭代器 比較迭代器的相等性 比較迭代器的不等性 |
輸出迭代器 |
*p p=p1 |
復引用迭代器,作為左值 將一個迭代器賦給另一個迭代器 |
正向迭代器 |
提供輸入輸出迭代器的所有功能 |
|
雙向迭代器 |
--p p-- |
前置自減迭代器 後置自減迭代器 |
隨機訪問迭代器 |
p+=i p-=i p+i p-i p[i] p<p1 p<=p1 p>p1 p>=p1 |
將迭代器遞增i位 將迭代器遞減i位 在p位加i位後的迭代器 在p位減i位後的迭代器 返回p位元素偏離i位的元素引用 如果迭代器p的位置在p1前,返回true,否則返回false p的位置在p1的前面或同一位置時返回true,否則返回false 如果迭代器p的位置在p1後,返回true,否則返回false p的位置在p1的後面或同一位置時返回true,否則返回false |
只有順序容器和關聯容器支援迭代器遍歷,各容器支援的迭代器的類別如下:
容器 |
支援的迭代器類別 |
vector |
隨機訪問 |
deque |
隨機訪問 |
list |
雙向 |
set |
雙向 |
multiset |
雙向 |
map |
雙向 |
multimap |
雙向 |
stack |
不支援 |
queue |
不支援 |
priority_queue |
不支援 |