1. 程式人生 > >C++五種型別的迭代器

C++五種型別的迭代器

     迭代器定義了常用的操作集,但有些迭代器具有比其他迭代器更強大的功能。例如ostream_iterator只支援自曾、解引用和複製運算,而vector容器提供的迭代器除了這些運算,還支援自減、關係和算數運算。因此,迭代器可根據所提供的操作集進行分類。類似地,還可根據演算法要求它的迭代器提供什麼型別的操作,對演算法分類。有一些演算法,例如 find,只要求迭代器提供讀取所指向內容和自增的功能。另一些演算法,,比如 sort,則要求其迭代器有讀、寫和隨機訪問元素的能力。演算法要求的迭代器操作分為五個類別,分別對應下表列出的五種迭代器:
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 則是輸出迭代器。