STL教程之迭代器以及輔助函式

2021-08-28 12:24:49 字數 3457 閱讀 7710

迭代器是一種能夠遍歷某個序列或容器的所有元素的物件,所有容器都有各自的迭代器,當開發人員使用某種容器的迭代器時,不需要包含特別的標頭檔案,但是如果要使用逆向迭代器、插入型迭代器、流迭代器,則需要包含< iterator>標頭檔案。

迭代器共分為五種,分別為: input iterator(輸入型迭代器)、output iterator(輸出型迭代器)、forward iterator(前向迭代器)、bidirectional iterator(雙向迭代器)、random access iterator(隨機訪問迭代器)。

只能一次乙個向前讀取元素,按此順序乙個個傳回元素值。input迭代器只能讀取元素一次,因為迭代器進行讀取操作後會立即進行++操作,如果你複製input迭代器,並使原input迭代器與新產生的副本都向前讀取,可能會遍歷到不同的值。純粹input迭代器的乙個典型例子就是「從標準輸入裝置(通常為鍵盤)讀取資料」的迭代器。

output迭代器和input迭代器相反,其作用是將元素值乙個個寫入。output iterator*只有在賦值語句的左手邊才有效。迭代器進行寫操作後會立即進行++操作,output迭代器無需比較(comparison)操作。你無法檢驗output迭代器是否有效,或「寫入動作」是否成功。你唯一可以做的就是寫入、寫入、再寫入。

forward迭代器是input迭代器與output迭代器的結合,具有input迭代器的全部功能和output迭代器的大部分功能。forward迭代器能多次指向同一群集中的同一元素,並能多次處理同一元素。

bidirectional(雙向)迭代器在forward迭代器的基礎上增加了回頭遍歷的能力。換言之,它支援–操作符,用以一步一步的後退操作。

random access迭代器在bidirectional迭代器的基礎上再增加隨機訪問能力。因此它必須提供「迭代器算數運算」(和一般指標「指標算術運算」相當)。也就是說,它能加減某個偏移量、能處理距離(differences)問題,並運用諸如《和》的相互關係操作符進行比較。以下物件和型別支援random access迭代器:可隨機訪問的容器(vector, deque)、strings(字串,string,wstring)、一般array(指標)。

下面是整理的各迭代器所能支援的操作及說明:

逆向迭代器重新定義遞增運算和遞減運算,使其行為正好倒置。成員函式rbegin()和rend()各傳回乙個reverse迭代器,和begin()和end()類似,共同定義乙個半開區間。用正向迭代器可以直接構造乙個逆向迭代器,但是構造之後會出現「錯位」現象。原因在逆向迭代器要保證半開區間不會越界,可呼叫逆向迭代器的base()函式,保證轉換值的正確性(迭代器移了一位)。

insert迭代器,也稱為inserters,用來將「賦值新值」操作轉換為「安插新值」操作。通過這種迭代器,演算法可以執行安插(insert)行為而非覆蓋(overwrite)行為。所有insert迭代器都隸屬於output迭代器型別。所以它只提供賦值(assign)新值的能力。

表示式 功能表述

*iter 無實際操作(傳回iter)

iter = value 安插value

++iter 無實際操作(傳回iter)

iter++ 無實際操作(傳回iter)

c++標準程式庫提供三種insert迭代器:back inserters, front inserters, general inserters。它們的區別在於插入位置。事實上它們各自呼叫所屬容器中不同的成員函式。

stream迭代器是一種迭代器配接器,通過它,你可以把stream當成演算法的原點和終點。更明確的說,乙個istream迭代器可以用來從input stream中讀元素,而乙個ostream迭代器可以用來對output stream寫入元素。

stream迭代器的一種特殊形式是所謂的stream緩衝區迭代器,用來對stream緩衝區進行直接讀取和寫入操作。

ostream迭代器 可以被賦予的值寫入output stream中。istream迭代器是ostream迭代器的拍檔,用來從input stream讀取元素。透過istream迭代器,演算法可以從stream中直接讀取資料。istream迭代器的各項操作。

stl提供三個輔助函式:advance(),distance(), 以及iter_swap().那前兩個函式給了所有迭代器一些能力,平常這些能力只有random access iterators擁有:向前移動多個位置和處理兩個迭代器的差值。第三個函式允許你交換兩個迭代器的值。

1、advance()函式:

#include < iterator>

void advance (inputiterator& pos, dist n)

1.讓input iterator pos 向前前進n個元素。

2.對於forbidirectional 和 random access iterators n也許是負數。

3.dist 是個模板引數,一般它是整型,因為像這樣的操作

4.該函式不檢查傳遞的迭代器是不是容器的end().所以在用時一定要注意。由於用到了 iterator traits, 該函式總是用最好的執行方式,因為它依賴於iterator category。對於random access iterators, 它只是簡單的呼叫pos+=n,對於其它的迭代器它呼叫 ++pos n 次。

2、distance()函式

#include < iterator>

dist distance (inputiterator pos1, inputiterator pos2)

1.返回兩個迭代器之間的距離。

2. 兩個迭代器一定要指向同乙個容器

3. 如果迭代器不是random access iterators,,那個pos2一定不能在pos1的後面,可以在同乙個位置。

4.返回值的型別依賴於迭代器的型別;iterator_traits< inputiterator>::difference_type。該函式也用到了iterator traits, 所以總是用最好的執行方式。

3、iter_swap()函式

#include < algorithm>

void iter_swap (forwarditerator1 pos1, forwarditerator2 pos2)

1.交換兩個迭代器的值

2. 迭代器不要求是同一種型別,但是值要是可賦值的。

迭代器和輔助函式

迭代器 iterator 是連線容器和演算法的紐帶,為資料提供了抽象,使寫演算法的人不必關心各種資料結構的細節。迭代器提供了資料訪問的標準模型 物件序列,使對容器更廣泛的訪問操作成為可能。根據迭代器所支援的操作不同,在 stl中定義了如下 5種迭代器 迭代器類別 說明輸入 從容器中讀取元素。輸入迭代...

迭代器的輔助函式

迭代器的輔助函式 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 ...