迭代器(
iterator
)是連線容器和演算法的紐帶,為資料提供了抽象,使寫演算法的人不必關心各種資料結構的細節。迭代器提供了資料訪問的標準模型——物件序列,使對容器更廣泛的訪問操作成為可能。
根據迭代器所支援的操作不同,在
stl中定義了如下
5種迭代器:
迭代器類別
說明輸入
從容器中讀取元素。輸入迭代器只能一次讀入乙個元素向前移動,輸入迭代器只支援一遍演算法,同乙個輸入迭代器不能遍歷乙個序列兩遍
輸出向容器中寫入元素。輸出迭代器只能一次乙個元素向前移動。輸出迭代器只支援一遍演算法,同一輸出迭代器不能兩次遍歷乙個序列
正向具有輸入迭代器的全部功能和輸出迭代器的大部分功能
雙向具有正向迭代器和逆向迭代器的功能,支援多遍演算法
隨機訪問
具有雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素
迭代器的層次結構:
上面這圖表並不是表明它們之間的繼承關係:而只是描述了迭代器的種類和介面。
迭代器能力:
輸入
輸出
前向
雙向
隨機訪問
讀取(= *i) √
× √√ √
寫入(*i =) ×
√ √√ √
多通
× ×
√ √
√ ++i和i++ √
√ √√ √
--i和i-- ×
× ×√ √
i[n]
× ×
× ×
√ i + n
和i - n ×
× ×× √
i += n
和i -= n ×
× ×× √
==和!= √
× √
√ √
<
×× ×
× √<=
= ×× ×
× √迭代器多通是指以同樣的順序來遍歷容器,而且迭代器遞增後,仍然可以通過解除儲存的迭代器引用,來獲得同樣的值。
這是因為有乙個約束條件,使得某些對output iterator有效的程式對forward iterator可能無效。
面對output iterator無須檢查其是否抵達序列尾端,便可直接寫入資料。事實上由於output iterator不提供比較操作,因此無法將output iterator與end-of-sequence相比較。以下迴圈是正確的:
while(true)
對於forward iterator,必須在提領資料之前確保其有效,因此上述迴圈對forward iterator是錯誤的。對於forward iterator上述迴圈應改為:
while( pos != coll.end() )
而同時,該迴圈不適用於output iterator,因為output iterator沒有operator!=
*將迭代器移至「起點更前面或end()之後」都會引起未定義行為。
迭代器的遞增和遞減操作有個奇怪的問題。一般而言你可以遞增或遞增暫時性迭代器,但對於vectors和strings就不行,如下:
vectorcoll;
coll.push_back(1);
coll.push_back(3);
coll.push_back(2);
coll.push_back(4);
if (coll.size() > 1)
copy(coll.begin(), coll.end(), ostream_iterator(cout, " "));
c++不允許你修改任何基本型別(包括指標)的暫時值,但對於struct和class則允許。因此如果迭代器被實作為一般指標,上面**編譯會失敗。如編譯不通過可以改為:
vector::iterator it = coll.begin();
sort(++it, coll.end());
#include
void advance(inputiterator pos,int n);
不檢查迭代器是否超過end(), 無返回值。
#include
iterator_traits::difference_type distance(inputiterator pos1,inputiterator pos2);
兩個迭代器都必須指向同乙個容器,從pos1必須能到達pos2
#include
void iter_swap(forwarditeraor1 pos1,forwarditeraor2 pos2);
迭代器型別不一定相同,但pos1和pos2的內容可相互賦值,交換迭代器pos1和pos2所指的值。
迭代器的輔助函式
迭代器的輔助函式 stl 中有用於操作迭代器的三個函式模板,它們是 advance p,n 使迭代器 p 向前或向後移動 n 個元素。distance p,q 計算兩個迭代器之間的距離,即迭代器 p 經過多少次 操作後和迭代器 q 相等。如果呼叫時 p 已經指向 q 的後面,則這個函式會陷入死迴圈。...
C STL迭代器輔助函式
平時零零碎碎用過,今天總結一下?該函式有多個過載,可以用於各類容器迭代器,可以讓乙個迭代器一次前進若干個元素,很好懂,舉個栗子 include include using namespace std intmain 輸出結果 1 32 include include using namespace ...
迭代器的輔助函式例項
問題及 檔名稱 main.cpp 作 者 崔青青 完成日期 2016年6月3日 版 本 號 v1.0 問題描述 輸入描述 無 輸出描述 無 include include include includeusing namespace std int main list iterator pos co...