頭文件
所有容器有含有其各自的迭代器型別(iterator types),所以當你使用一般的容器迭代器時,並不需要含入專門的頭文件。不過有幾種特別的迭代器,例如逆向迭代器,被定義於<iterator>中。
2 迭代器類型
迭代器共分爲五種,分別爲: Input iterator、Output iterator、Forward iterator、Bidirectional iterator、Random 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.2 Output(輸出)迭代器
Output迭代器和Input迭代器相反,其作用是將元素值一個個寫入。表2.2列出Output迭代器的有效操作。operator*只有在賦值語句的左手邊纔有效。Output迭代器無需比較(comparison)操作。你無法檢驗Output迭代器是否有效,或“寫入動作”是否成功。你唯一可以做的就是寫入、寫入、再寫入。
-
表達式
效果
*iter = value
將元素寫入到迭代器所指位置
++iter
向前步進(傳回新位置)
iter++
向前步進(傳回舊位置)
TYPE(iter)
複製迭代器(copy 構造函數)
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.4 Bidirectional(雙向)迭代器
Bidirectional(雙向)迭代器在Forward迭代器的基礎上增加了回頭遍歷的能力。換言之,它支持遞減操作符,用以一步一步的後退操作。
2.5 Random Access(隨機存取)迭代器
Random Access迭代器在Bidirectional迭代器的基礎上再增加隨機存取能力。因此它必須提供“迭代器算數運算”(和一般指針“指針算術運算”相當)。也就是說,它能加減某個偏移量、能處理距離(differences)問題,並運用諸如<和>的相互關係操作符進行比較。以下對象和型別支持Random Access迭代器:
-
可隨機存取的容器(vector, deque)
-
strings(字符串,string,wstring)
-
一般array(指針)
3 迭代器相關輔助函數
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)
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
檢查iter1和iter2是否相等
iter1 != iter2
檢查iter1和iter2是否不相等