STL--迭代器

 頭文件

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

2 迭代器類型

  迭代器共分爲五種,分別爲: Input iteratorOutput iteratorForward iteratorBidirectional iteratorRandom access iterator

2.1 Input(輸入)迭代器

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

表達式

效果

*iter

讀取實際元素

iter->member

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

++iter

向前步進(傳回新位置)

iter++

向前步進(傳回舊位置)

iter1 == iter2

判斷兩個迭代器是否相同

iter1 != iter2

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

TYPE(iter)

複製迭代器(copy 構造函數)

                                                                   表2.1 

2.2 Output(輸出)迭代器

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

表達式

效果

*iter = value

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

++iter

向前步進(傳回新位置)

iter++

向前步進(傳回舊位置)

TYPE(iter)

複製迭代器(copy 構造函數)

                                                                   表2.2

2.3 Forward(前向)迭代器

  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

2.4 Bidirectional(雙向)迭代器

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

2.5 Random Access(隨機存取)迭代器  

  Random Access迭代器在Bidirectional迭代器的基礎上再增加隨機存取能力。因此它必須提供“迭代器算數運算”(和一般指針“指針算術運算”相當)。也就是說,它能加減某個偏移量、能處理距離(differences)問題,並運用諸如<>的相互關係操作符進行比較。以下對象和型別支持Random Access迭代器:

  • 可隨機存取的容器(vector, deque

  • strings(字符串,stringwstring

  • 一般array(指針)

迭代器相關輔助函數 

3.1 advance() 令迭代器前進  

3.2 distance() 處理迭代器之間的距離 

3.3 iter_swap() 交換兩個迭代器所指內容

4  迭代器配接器

4.1 Reverse(逆向迭代器)

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

4.2 Insert(安插型)迭代器

  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)

4.3 Stream(流)迭代器

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

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

Ostream迭代器

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

算式

效果

ostream_iterator<T>(ostream)

ostream產生一個ostream迭代器

ostream_iterator<T>(ostream, delim)

ostream產生一個ostream迭代器,各元素間以delim爲分隔符(請注意,delim的型別是const char*

*iter

無實際操作(傳回iter

iter = value

value寫到ostream,像這樣:ostream<<value。其後再輸出一個delim(分隔符;如有定義的話)

++iter

無實際操作(傳回iter

iter++

無實際操作(傳回iter

Istream迭代器

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

算式

效果

istream_iterator<T>()

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

istream_iterator<T>(istream)

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

*iter

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

iter->member

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

++iter

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

iter++

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

iter1 == iter2

檢查iter1iter2是否相等

iter1 != iter2

檢查iter1iter2是否不相等

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章