迭代器和輔助函式

2021-06-22 20:29:36 字數 2519 閱讀 5314



迭代器(

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...