C++五種型別的迭代器
Input iterator(輸入迭代器) |
讀,不能寫 |
只支援自增運算 |
Output iterator(輸出迭代器) ; |
寫,不能讀 |
只支援自增運算 |
Forward iterator(前向迭代器) |
讀和寫; |
只支援自增運算 |
Bidirectional iterator(雙向迭代器) ; |
讀和寫 |
支援自增和自減運算 |
Random access iterator(隨機訪問迭代器) |
讀和寫; |
支援完整的迭代器算術運 算 |
「1」. 輸入迭代器可用於讀取容器中的元素,但是不保證能支援容器的寫入操作。輸入迭代器必須至少提供下列支援。
o 相等和不等操作符(==,!=),比較兩個迭代器。
o 前置和後置的自增運算(++)使迭代器向前遞進指向下一個元素。
o 用於讀取元素的解引用操作符(*),此操作符只能出現在賦值運
算的右運算元上。
o 箭頭操作符(->),這是 (*it).member 的同義語,也就是說,對迭代器進行解引用來獲取其所關聯的物件的成員。輸入迭代器只能順序使用;一旦輸入迭代器自增了,就無法再用它檢查之前的元素。要求在這個層次上提供支援的泛型演算法包括 find 和accumulate。標準庫 istream_iterator 型別輸入迭代器。
「2.」 輸出迭代器 可視為與輸入迭代器功能互補的迭代器;輸出迭代器可用於向容器寫入元素,但是不保證能支援讀取容器內容。輸出迭代器要求:
o 前置和後置的自增運算(++),使迭代器向前遞進指向下一個元素。
o解引用操作符(*),引操作符只能出現在賦值運算的左運算元上。給解引用的輸出迭代器賦值,將對該迭代器所指向的元素做寫入操作。輸出迭代器可以要求每個迭代器的值必須
正好寫入一次。使用輸出迭代器時,對於指定的迭代器值應該使用一次 * 運算,而且只能用一次。輸出迭代器一般用作演算法的第三個實參,標記起始寫入的位置。例如,copy 演算法使用一個輸出迭代器作為它的第三個實參,將輸入範圍內的元素複製到輸出迭代器指定的目標位置。標準庫 ostream_iterator 型別輸出迭代器。
「3.」 前向迭代器 用於讀寫指定的容器。這類迭代器只會以一個方向遍歷序列。前向迭代器支援輸入迭代器和輸出迭代器提供的所有操作,除此之外,還支援對同一個元素的多次讀寫。可複製前向迭代器來記錄序列中的一個位置,以便將來返回此處。需要前向迭代器的泛型演算法包括 replace。
「4」雙向迭代器 從兩個方向讀寫容器。除了提供前向迭代器的全部操作之外,雙向迭代器還提供前置和後置的自減運算(--)。需要使用雙向迭代器的泛型演算法包括 reverse。所有標準庫容器提供的迭代器都至少達到雙向迭代器的要求。
「 5」. 隨機訪問迭代器 提供在常量時間內訪問容器任意位置的功能。這種迭代器除了支援雙向迭代器的所有功能之外,還支援下面的操作:
o 關係操作符 <、<=、> 和 >=,比較兩個迭代器的相對位置。
o 迭代器與整型數值 n 之間的加法和減法操作符 +、+=、- 和 -=,結果是迭代器在容器中向前(或退回)n 個元素。
o 兩個迭代器之間的減法操作符(--),得到兩個迭代器間的距離。
o 下標操作符 iter[n],這是 *(iter + n) 的同義詞。需要隨機訪問迭代器的泛型演算法包括 sort 演算法。vector、deque
和string 迭代器是隨機訪問迭代器,用作訪問內建陣列元素的指標也是隨機訪問迭代器。除了輸出迭代器,其他類別的迭代器形成了一個層次結構:需要低階類別迭代器的地方,可使用任意一種更高階的迭代器。對於需要輸入迭代器的演算法,可傳遞前向、雙向或隨機訪問迭代器呼叫該演算法。呼叫需要隨機訪問迭代器的演算法時,必須傳遞隨機訪問迭代器。map、set 和 list 型別提供雙向迭代器,而
string、vector 和 deque 容器上定義的迭代器都是隨機訪問迭代器都是隨機訪問迭代器,用作訪問內建陣列元素的指標也是隨機訪問迭代器。istream_iterator 是輸入迭代器,而ostream_iterator 則是輸出迭代器。