溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何理解c++下迭代器

發(fā)布時(shí)間:2021-12-22 19:48:30 來(lái)源:億速云 閱讀:151 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

這篇文章給大家介紹如何理解c++下迭代器,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

1. 迭代器介紹

本章并不研究不同類(lèi)型的迭代器,只總結(jié)常見(jiàn)迭代器的使用和誤區(qū)。

定義:迭代器(iterator)有時(shí)又稱(chēng)光標(biāo)(cursor),是程序設(shè)計(jì)的軟件設(shè)計(jì)模式,可在容器對(duì)象(container,例如鏈表或數(shù)組)上遍歷的接口,設(shè)計(jì)人員無(wú)需關(guān)心容器對(duì)象的內(nèi)存分配的實(shí)現(xiàn)細(xì)節(jié)。

背景:指針可以用來(lái)遍歷存儲(chǔ)空間連續(xù)的數(shù)據(jù)結(jié)構(gòu),但是對(duì)于非連續(xù)存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),就需要一個(gè)行為類(lèi)似于指針的類(lèi),來(lái)對(duì)非連續(xù)數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷。正如定義里標(biāo)紅所說(shuō),迭代器可以遍歷非連續(xù)的數(shù)據(jù)結(jié)構(gòu)。

在C++中,我們更傾向于使用迭代器而不是使用下標(biāo)操作,因?yàn)闃?biāo)準(zhǔn)庫(kù)為每一種標(biāo)準(zhǔn)容器(如vector)定義了一種迭代器類(lèi)型,而只有少數(shù)容器(如vector)支持下標(biāo)操作訪問(wèn)容器元素。

2. 初始化

每種容器都定義了自己的迭代器類(lèi)型,可以使用auto自動(dòng)聲明迭代器的類(lèi)型,也可以顯示的將迭代器類(lèi)型寫(xiě)出來(lái):

//只有順序容器(不包括array)的構(gòu)造函數(shù)才接受大小參數(shù)
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,指向容器的下一個(gè)元素
–iter, iter–同上
iter1 == iter2比較兩個(gè)迭代器是否相等
iter1 != iter2

在C++定義的容器類(lèi)型中,只有vector,string和queue容器提供迭代器算術(shù)運(yùn)算和除!=和==之外的關(guān)系運(yùn)算:

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

注意:

迭代器并不是所有都可以進(jìn)行加減常數(shù)。 能進(jìn)行算數(shù)運(yùn)算的迭代器只有隨機(jī)訪問(wèn)迭代器。要求容器元素存儲(chǔ)在連續(xù)空間內(nèi);即vector、string、deque的迭代器是有加減法的;但是list、forward_list、map、set的迭代器是沒(méi)有加減法的,它們僅支持++iter、–iter這些操作。 it++和++it的區(qū)別

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

++it返回的是引用;it++返回的是臨時(shí)對(duì)象;–it同理。

原因:it++每次都要返回一個(gè)無(wú)用的臨時(shí)對(duì)象,所以每一次遍歷,你都進(jìn)行了一次創(chuàng)建并銷(xiāo)毀對(duì)象的操作。(leetcode小本本記好了!)

關(guān)于如何理解c++下迭代器就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI