目錄
本章並不研究不同型別的迭代器,只總結常見迭代器的使用和誤區。
定義:迭代器(iterator)有時又稱游標(cursor),是程式設計的軟體設計模式,可在容器物件(container,例如鍊錶或陣列)上遍歷的介面,設計人員無需關心容器物件的記憶體分配的實現細節。
背景:指標可以用來遍歷儲存空間連續的資料結構,但是對於非連續儲存的資料結構,就需要乙個行為類似於指標的類,來對非連續資料結構進行遍歷。正如定義裡標紅所說,迭代器可以遍歷非連續的資料結構。
在c++中,我們更傾向於使用迭代器而不是使用下標操作,因為標準庫為每一種標準容器(如vector)定義了一種迭代器型別,而只有少數容器(如vector)支援下標操作訪問容器元素。
每種容器都www.cppcns.com定義了自己的迭代器型別,可以使用auto自動宣告迭代器的型別,也可以顯示的將迭代器型別寫出來:
//只有順序容器(不包括array)的建構函式才接受大小引數
vector vec(num, val);
vector::iterator it = vec.begin();
//auto it = vec.begin();
下面**列程式設計客棧出了迭代器的常用操作:
*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的迭代器是有加減法的;但是www.cppcns.comlist、forward_list、map、set的迭代器是沒有加減法的,它們僅支援++iter、–iter這些操作。 it++和++it的區別
在stl中的容器使用迭代器進行遍歷時,it++與++it的效果是相同的,遍歷的次數也是相同的,但是在stl中效率卻不同:
++it返回的是引用;it++返回的是臨時物件;–it同理。
原因:it++每次都要返回乙個無用的臨時物件,所以每一次遍歷,你都進行了一次建立並銷毀物件的操作。(leetcode小本本記好了!)
迭代器python Python 迭代器總結
迭代器是python乙個強大的功能,它可以記錄被迭代 物件 的位置,迭代器物件從集合的第乙個元素開始訪問資料,直到所有資料訪問結束,迭代器有兩個基本函式iter 和next iter 用來生成迭代器 next 用來返回迭代器的下乙個資料 python內建模組itertools,提供了很多非常有用的函...
C 迭代器失效情況總結
迭代器失效分三種情況考慮,也是分三種資料結構考慮,分別為陣列型,鏈表型,樹型資料結構。陣列型資料結構 該資料結構的元素是分配在連續的記憶體中,insert和erase操作,都會使得刪除點和插入點之後的元素挪位置,所以,插入點和刪除掉之後的迭代器全部失效,也就是說insert iter 或erase ...
C 之迭代器失效總結
1.對於序列式容器 如vector,deque 序列式容器就是陣列式容器,刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的記憶體,刪除乙個元素導致後面所有的元素會向前移動乙個位置。所以不能使用erase iter 的方式,還好eras...