c++下迭代器總結(jié)
1. 迭代器介紹
本章并不研究不同類型的迭代器,只總結(jié)常見迭代器的使用和誤區(qū)。
定義:迭代器(iterator)有時(shí)又稱光標(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)對(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)定義了一種迭代器類型,而只有少數(shù)容器(如vector)支持下標(biāo)操作訪問(wèn)容器元素。
2. 初始化
每種容器都定義了自己的迭代器類型,可以使用auto自動(dòng)聲明迭代器的類型,也可以顯示的將迭代器類型寫出來(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++定義的容器類型中,只有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的迭代器是沒有加減法的,它們僅支持++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)建并銷毀對(duì)象的操作。(leetcode小本本記好了?。?/p>
總結(jié)
到此這篇關(guān)于c++下迭代器總結(jié)的文章就介紹到這了,更多相關(guān)c++ 迭代器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)MP3音樂播放器
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)MP3音樂播放器,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03
基于C語(yǔ)言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)
這篇文章主要為大家詳細(xì)介紹如何基于C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的隨機(jī)點(diǎn)名器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下2022-07-07
基于Matlab實(shí)現(xiàn)水波倒影特效的制作
這篇文章主要介紹了如何利用Matlab制作出水波倒影的特效,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-03-03
Easyx實(shí)現(xiàn)窗口自動(dòng)碰撞的小球
這篇文章主要為大家詳細(xì)介紹了Easyx實(shí)現(xiàn)窗口自動(dòng)碰撞的小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
學(xué)生成績(jī)管理系統(tǒng)C語(yǔ)言代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

