c++下迭代器總結

1. 迭代器介紹

本章並不研究不同類型的迭代器,隻總結常見迭代器的使用和誤區。

定義:迭代器(iterator)有時又稱光標(cursor),是程序設計的軟件設計模式,可在容器對象(container,例如鏈表或數組)上遍歷的接口,設計人員無需關心容器對象的內存分配的實現細節。

背景:指針可以用來遍歷存儲空間連續的數據結構,但是對於非連續存儲的數據結構,就需要一個行為類似於指針的類,來對非連續數據結構進行遍歷。正如定義裡標紅所說,迭代器可以遍歷非連續的數據結構。

在C++中,我們更傾向於使用迭代器而不是使用下標操作,因為標準庫為每一種標準容器(如vector)定義瞭一種迭代器類型,而隻有少數容器(如vector)支持下標操作訪問容器元素。

2. 初始化

每種容器都定義瞭自己的迭代器類型,可以使用auto自動聲明迭代器的類型,也可以顯示的將迭代器類型寫出來:

//隻有順序容器(不包括array)的構造函數才接受大小參數
vector<int> vec(num, val);
vector<int>::iterator it = vec.begin();
//auto it = vec.begin();

3. 常用操作

下面表格列出瞭迭代器的常用操作:

*iter 解引用,返回迭代器指向的元素的引用
iter->member 等效於(*iter).member
++iter, iter++ iter + 1,指向容器的下一個元素
–iter, iter– 同上
iter1 == iter2 比較兩個迭代器是否相等
iter1 != iter2

在C++定義的容器類型中,隻有vector,string和queue容器提供迭代器算術運算和除!=和==之外的關系運算:

iter + n, iter – n 迭代器+或-一個常數,必須指向容器內或尾後元素(end())
iter1 += iter2 同上
iter1 -= iter2 同上
iter1 – iter2 獲得兩個迭代器之間的距離
>, >=, <, <= 元素靠後的迭代器大於靠前的迭代器

註意:

迭代器並不是所有都可以進行加減常數。 能進行算數運算的迭代器隻有隨機訪問迭代器。要求容器元素存儲在連續空間內;即vector、string、deque的迭代器是有加減法的;但是list、forward_list、map、set的迭代器是沒有加減法的,它們僅支持++iter、–iter這些操作。 it++和++it的區別

在STL中的容器使用迭代器進行遍歷時,it++與++it的效果是相同的,遍歷的次數也是相同的,但是在STL中效率卻不同:

++it返回的是引用;it++返回的是臨時對象;–it同理。

原因:it++每次都要返回一個無用的臨時對象,所以每一次遍歷,你都進行瞭一次創建並銷毀對象的操作。(leetcode小本本記好瞭!)

總結

到此這篇關於c++下迭代器總結的文章就介紹到這瞭,更多相關c++ 迭代器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: