一、迭代器分類
1.輸入迭代器(只能從序列容器中讀取數據,不能向其中寫入數據)
- 如輸入流迭代器:istream_iterator<T>
2.輸出迭代器(只能向序列容器中寫入數據,不能從其中讀取數據,不要求定義==和!=)
- 如輸出流迭代器ostream_iterator<T> out(輸出流對象,字符串),向輸出流中寫入數據時,將字符串插入到各個數據之間
3.前向迭代器
- 既是輸入迭代器,同時又是輸出迭代器,同時支持數據讀取和寫入。並且可以對序列進行單方向遍歷;可以保存一個前向迭代器,並利用它從同一個位置重新遍歷,一次支持多遍掃描算法。
- replace算法(必須滿足前向迭代器的條件):replace(first_iterator , last_iterator
, const T& x , const T &y),將容器[first,last)區間內素有等於x的值用y替代,時間複雜度爲O(N),但first_iterator和last_iterator必須滿足前向迭代器的條件
- 數組、鏈表list、雙端隊列deque均滿足雙端隊列的條件;
4.雙向迭代器
- 具有單向迭代器所有功能&&可以在兩個方向遍歷數據(支持序列反向遍歷)
- 必須定義前綴和後綴++ 和--操作,時間複雜度均爲常量;
- reverse算法(必須滿足雙向迭代器的條件):reverse(start,end),翻轉[start,end)區間內所有元素;
- 鏈表list(雙鏈表)滿足雙向迭代器的條件。
5.隨機訪問迭代器
- 支持雙向迭代器所有功能&&整數的加法和減法操作,r+n,r-n,n+r等&&使用表達式r[n]訪問容器中第n個元素&&雙向“跳轉”,以r+=n和r-=n表示;迭代器減法,以r-s表示;比較,以r<s,r>s,r<=s,r>=s表示,結果爲bool;
注:r和s均爲隨機訪問迭代器;n爲整數;
6.STL迭代器的層次結構:算法和容器之間的高效結合
- 輸入/輸出迭代器—>前向迭代器—>雙向迭代器—>隨機訪問迭代器
- list是雙向迭代器;
- find算法要求輸入迭代器
- sort算法要求隨機訪問迭代器
- deque提供了隨機訪問迭代器
- set提供了雙向迭代器
- merge算法要求輸入迭代器或更高級的迭代器
7.插入迭代器(將類屬算法轉入到“插入模式”)
- back_insert_iterator<Container>:使用Container的push_back成員函數,適用於vector,list,deque等類型的容器(它們都提供了push_back成員函數);
- front_insert_iterator<Container>:使用Container的push_front成員函數,有線性複雜度,vector無法提供push_front成員函數,因此該迭代器不適用於vector;
- insert_iterator<Container>:使用Container的insert成員函數,最爲普通的插入迭代器,允許在容器任意位置插入數據;可用於任何類型的容器(因爲任何容器均提供了insert(iterator,value)成員函數)
- 注:這種插入操作使容器擴展已分配內存空間,賦值操作要求必須實現存在已分配內存保存結果。
對應函數:
- back_inserter(Container c):同back_insert_iterator<Container>(Container c)
- front_inserter(Container c):同front_insert_iterator<Container>(Container c)
- inserter(Container c):對應於insert_iterator<Container>(Container c)