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