《C 標準程式庫》 STL迭代器

2021-06-18 04:16:03 字數 4292 閱讀 8622

所有容器有含有其各自的迭代器型別(iterator types),所以當你使用一般的容器迭代器時,並不需要含入專門的標頭檔案。不過有幾種特別的迭代器,例如逆向迭代器,被定義於中。

迭代器共分為五種,分別為: input iterator、output iterator、forward iterator、bidirectional iterator、random access iterator。

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

表示式效果*iter

讀取實際元素

iter->member

讀取實際元素的成員(如果有的話)

++iter

向前步進(傳回新位置)

iter++

向前步進(傳回舊位置)

iter1 == iter2

判斷兩個迭代器是否相同

iter1 != iter2

判斷兩個迭代器是否不相等

type(iter)

複製迭代器(

copy 

建構函式)

表2.1 

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

表示式效果

*iter = value

將元素寫入到迭代器所指位置

++iter

向前步進(傳回新位置)

iter++

向前步進(傳回舊位置)

type(iter)

複製迭代器(copy 建構函式)

表2.2

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

表示式效果

*iter

訪問實際元素

iter->member

訪問實際元素的成員

++iter

向前步進(傳回新位置)

iter++

向前步進(傳回舊位置)

iter1 == iter2

判斷兩個迭代器是否相同

iter1 != iter2

判斷兩個迭代器是否不相等

type()

產生迭代器(default建構函式)

type(iter)

複製迭代器(copy建構函式)

iter1 == iter2 複製

表2.3

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

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

3.1 advance() 

令迭代器前進 

3.2 distance()

處理迭代器之間的距離

3.3 iter_swap() 

交換兩個迭代器所指內容

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

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

表示式效果

*iter

無實際操作(傳回iter)

iter = value 安插

value

++iter

無實際操作(傳回

iter)

iter++

無實際操作(傳回

iter)

表4.2.1

c++標準程式庫提供三種insert迭代器:back inserters, front inserters, general inserters。它們的區別在於插入位置。事實上它們各自呼叫所屬容器中不同的成員函式。所以insert迭代器初始化時要清楚知道自己所屬的容器是哪一種。表4.2.2列出insert迭代器的種類。

名稱class

其所呼叫的函式

生成函式

back inserter

back_inserter_iterator

push_back(value)

back_inserter(cont)

front inserter

front_insert_iterator

push_front(value)

front_inserter(cont)

general inserter

insert_iterator

insert(pos, value)

inserter(cont, pos)

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

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

ostream迭代器

ostream迭代器 可以被賦予的值寫入output stream中。下表列出ostream迭代器的各項操作

算式效果

ostream_iterator(ostream)

為ostream產生乙個ostream迭代器

ostream_iterator(ostream, delim) 為

ostream

產生乙個

ostream

迭代器,各元素間以

delim

為分隔符(請注意,

delim

的型別是

const char*)

*iter

無實際操作(傳回

iter)

iter = value 將

value

寫到ostream

,像這樣:

ostream<。其後再輸出乙個

delim

(分隔符;如有定義的話)

++iter

無實際操作(傳回

iter)

iter++

無實際操作(傳回

iter)

istream迭代器

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

算式效果

istream_iterator()

產生乙個end-of-stream迭代器

istream_iterator(istream) 為

istream

產生的乙個迭代器(可能立即去讀第乙個元素)

*iter

傳回先前讀取的值(如果建構函式並未立刻讀取第乙個元素值,則本式執行讀取任務)

iter->member

傳回先前讀取的元素的成員(如果有的話)

++iter

讀取下乙個元素,並傳回其位置

iter++

讀取下乙個元素,並傳回迭代器指向前乙個元素

iter1 == iter2 檢查

iter1

和iter2

是否相等

iter1 != iter2 檢查

iter1

和iter2

是否不相等

《C 標準程式庫》學習筆記(三)迭代器

迭代器是乙個 可遍歷 stl容器內全部或部分元素 的物件。乙個迭代器用來指出容器中的乙個特定位置。迭代器奉行乙個純粹抽象概念 任何東西,只要行為類似迭代器,就是一種迭代器。迭代器的分類 iterator categories 根據能力的不同,迭代器被劃分為五種不同類別。迭代器型別 category ...

C 標準程式庫

1.如果要把乙個template中的某個識別符號號指定為一種型別,就算意圖顯而易見,關鍵字typename也不可或缺,因此一般的規則是,除了以typename修飾之外,template內的任何識別符號號都被視為乙個值而非乙個型別.2.類的成員函式可以是個template,但這樣的成員函式既不能是vi...

C 之標準程式庫

標準程式庫 c 中的標準程式庫是類庫和函式的集合,其使用核心語言寫成。標準程式庫提供若干泛型容器 函式物件 泛型字串和流 包含互動和檔案i o 支援部分語言特性和常用的函式,如開平方根。c 標準程式庫也吸收了iso c90c標準程式庫。標準程式庫的特性宣告於std命名空間之中。從上面這個定義來看,c...