STL 迭代器

一、迭代器分類
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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章