五類迭代器如下:
1、輸入迭代器:只讀,一次傳遞
為輸入迭代器預定義實現只有istream_iterator和istreambuf_iterator,用於從一個輸入流istream中讀取。一個輸入迭代器僅能對它所選擇的每個元素進行一次解析,它們只能向前移動。一個專門的構造函數定義了超越末尾的值。總是,輸入迭代器可以對讀操作的結果進行解析(對每個值僅解析一次),然後向前移動。
2、輸出迭代器:只寫,一次傳遞
這是對輸入迭代器的補充,不過是寫操作而不是讀操作。為輸出迭代器的預定義實現只有ostream_iterator和ostreambuf_iterator,用於向一個輸出流ostream寫數據,還有一個一般較少使用的raw_storage_iterator。他們只能對每個寫出的值進行一次解析,並且只能向前移動。對於輸出迭代器來說,沒有使用超越末尾的值來結束的概念。總之,輸出迭代器可以對寫操作的值進行解析(對每一個值僅解析一次),然後向前移動。
3、前向迭代器:多次讀/寫
前向迭代器包含了輸入和輸出迭代器兩者的功能,加上還可以多次解析一個迭代器指定的位置,因此可以對一個值進行多次讀/寫。顧名思義,前向迭代器只能向前移動。沒有為前向迭代器預定義迭代器。
4、雙向迭代器:operator--
雙向迭代器具有前向迭代器的全部功能。另外它還可以利用自減操作符operator--向後一次移動一個位置。由list容器中返回的迭代器都是雙向的。
5、隨機訪問迭代器:類似於一個指針
隨機訪問迭代器具有雙向迭代器的所有功能,再加上一個指針所有的功能(一個指針就是一個隨機訪問迭代器),除了沒有一種“空(null)”迭代器和空指針對應。基本上可以這樣說,一個隨機訪問迭代器就像一個指針那樣可以進行任何操作,包括使用操作符operator[]進行索引,加某個數值到一個指針就可以向前或者向後移動若干個位置,或者使用比較運算符在迭代器之間進行比較。
vector 和deque提供的是RandomAccessIterator,list提供的是BidirectionalIterator,set和map提供的 iterators是 Bidirectional Iterator,hash_set和hash_map的迭代器是Forward Iterator。關於STL中iterator迭代器的操作如下:
迭代器類別
說明
輸入迭代器
從容器中讀取元素。輸入迭代器只能一次讀入一個元素向前移動,輸入迭代器只支持一遍算法,同一個輸入迭代器不能兩遍遍歷一個序列
輸出迭代器
向容器中寫入元素。輸出迭代器只能一次一個元素向前移動。輸出迭代器只支持一遍算法,統一輸出迭代器不能兩次遍歷一個序列
正向迭代器
組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置
雙向迭代器
組合正向迭代器和逆向迭代器的功能,支持多遍算法
隨機訪問迭代器
組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素
迭代器的操作:
每種迭代器均可進行包括表中前一種迭代器可進行的操作。迭代器的操作本質上是通過重載運算符來實現的,迭代器支持何種操作和能夠執行什麼運算是由迭代器所重載的運算符來決定的。
迭代器類型 操作類型 說明所有迭代器
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 不支持 hash_set 前向 hash_map 前向