1. 程式人生 > 其它 >STL迭代器

STL迭代器

原文地址 http://c.biancheng.net/view/6675.html
1 迭代器

常用的迭代器按功能強弱分為輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器、隨機訪問迭代器 5 種。

  1. 前向迭代器(forward iterator)
    假設 p 是一個前向迭代器,則 p 支援 ++p,p++,*p 操作,還可以被複制或賦值,可以用 == 和 != 運算子進行比較。此外,兩個正向迭代器可以互相賦值。

  2. 雙向迭代器(bidirectional iterator)
    雙向迭代器具有正向迭代器的全部功能,除此之外,假設 p 是一個雙向迭代器,則還可以進行 --p 或者 p-- 操作(即一次向後移動一個位置)。

  3. 隨機訪問迭代器(random access iterator)
    隨機訪問迭代器具有雙向迭代器的全部功能。除此之外,假設 p 是一個隨機訪問迭代器,i 是一個整型變數或常量,則 p 還支援以下操作:
    p+=i:使得 p 往後移動 i 個元素。
    p-=i:使得 p 往前移動 i 個元素。
    p+i:返回 p 後面第 i 個元素的迭代器。
    p-i:返回 p 前面第 i 個元素的迭代器。
    p[i]:返回 p 後面第 i 個元素的引用。

容器
對應的迭代器型別
array
隨機訪問迭代器
vector
隨機訪問迭代器
deque
隨機訪問迭代器
list
雙向迭代器
set / multiset
雙向迭代器
map / multimap
雙向迭代器
forward_list
前向迭代器
unordered_map / unordered_multimap
前向迭代器
unordered_set / unordered_multiset
前向迭代器
stack
不支援迭代器
queue
不支援迭代器

正向迭代器
容器類名::iterator 迭代器名;
常量正向迭代器
容器類名::const_iterator 迭代器名;
反向迭代器
容器類名::reverse_iterator 迭代器名;
常量反向迭代器
容器類名::const_reverse_iterator 迭代器名;

2 迭代器介面卡

通過學習 C++ STL 標準庫中的容器我們知道,無論是序列式容器還是關聯式容器(包括雜湊容器),要想遍歷容器中儲存的資料,就只能用使用該容器模板類中提供的迭代器。

《C++ STL迭代器》一節提到,C++ STL 標準庫中迭代器大致分為 5 種類型,分別是輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器以及隨機訪問迭代器。值得一提的是,這 5 種迭代器是 STL 標準庫提供的最基礎的迭代器,很多場景中遍歷容器的需求,它們並不適合。

所謂迭代器介面卡,其本質也是一個模板類,比較特殊的是,該模板類是藉助以上 5 種基礎迭代器實現的。換句話說,迭代器介面卡模板類的內部實現,是通過對以上 5 種基礎迭代器擁有的成員方法進行整合、修改,甚至為了實現某些功能還會新增一些新的成員方法。由此,將基礎迭代器“改頭換面”,就變成了本節要講的迭代器介面卡。

C++ 11 標準中,迭代器介面卡供有 4 類,它們各自的名稱和功能如表 1 所示。

表 1 C++ STL迭代器介面卡種類
名稱
功能
反向迭代器(reverse_iterator)
又稱“逆向迭代器”,其內部重新定義了遞增運算子(++)和遞減運算子(--),專門用來實現對容器的逆序遍歷。
安插型迭代器(inserter或者insert_iterator)
通常用於在容器的任何位置新增新的元素,需要注意的是,此類迭代器不能被運用到元素個數固定的容器(比如 array)上。
流迭代器(istream_iterator / ostream_iterator)
流緩衝區迭代器(istreambuf_iterator /ostreambuf_iterator)
輸入流迭代器用於從檔案或者鍵盤讀取資料;相反,輸出流迭代器用於將資料輸出到檔案或者螢幕上。
輸入流緩衝區迭代器用於從輸入緩衝區中逐個讀取資料;輸出流緩衝區迭代器用於將資料逐個寫入輸出流緩衝區。
移動迭代器(move_iterator)
此型別迭代器是 C++ 11 標準中新新增的,可以將某個範圍的類物件移動到目標範圍,而不需要通過拷貝去移動。