網(wǎng)站首頁 編程語言 正文
1. 迭代器介紹
本章并不研究不同類型的迭代器,只總結(jié)常見迭代器的使用和誤區(qū)。
定義
:迭代器(iterator)有時又稱光標(biāo)(cursor),是程序設(shè)計的軟件設(shè)計模式,可在容器對象(container,例如鏈表或數(shù)組)上遍歷的接口,設(shè)計人員無需關(guān)心容器對象的內(nèi)存分配的實現(xiàn)細(xì)節(jié)。
背景
:指針可以用來遍歷存儲空間連續(xù)的數(shù)據(jù)結(jié)構(gòu),但是對于非連續(xù)存儲的數(shù)據(jù)結(jié)構(gòu),就需要一個行為類似于指針的類,來對非連續(xù)數(shù)據(jù)結(jié)構(gòu)進行遍歷。正如定義里標(biāo)紅所說,迭代器可以遍歷非連續(xù)的數(shù)據(jù)結(jié)構(gòu)。
在C++中,我們更傾向于使用迭代器而不是使用下標(biāo)操作,因為標(biāo)準(zhǔn)庫為每一種標(biāo)準(zhǔn)容器(如vector)定義了一種迭代器類型,而只有少數(shù)容器(如vector)支持下標(biāo)操作訪問容器元素。
2. 初始化
每種容器都定義了自己的迭代器類型,可以使用auto自動聲明迭代器的類型,也可以顯示的將迭代器類型寫出來:
//只有順序容器(不包括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,指向容器的下一個元素 |
–iter, iter– | 同上 |
iter1 == iter2 | 比較兩個迭代器是否相等 |
iter1 != iter2 |
在C++定義的容器類型中,只有vector,string和queue容器提供迭代器算術(shù)運算和除!=和==之外的關(guān)系運算:
iter + n, iter - n | 迭代器+或-一個常數(shù),必須指向容器內(nèi)或尾后元素(end()) |
---|---|
iter1 += iter2 | 同上 |
iter1 -= iter2 | 同上 |
iter1 - iter2 | 獲得兩個迭代器之間的距離 |
>, >=, <, <= | 元素靠后的迭代器大于靠前的迭代器 |
注意:
迭代器并不是所有都可以進行加減常數(shù)。 能進行算數(shù)運算的迭代器只有隨機訪問迭代器。要求容器元素存儲在連續(xù)空間內(nèi);即vector、string、deque的迭代器是有加減法的;但是list、forward_list、map、set的迭代器是沒有加減法的,它們僅支持++iter、–iter這些操作。 it++和++it的區(qū)別
在STL中的容器使用迭代器進行遍歷時,it++與++it的效果是相同的,遍歷的次數(shù)也是相同的,但是在STL中效率卻不同:
++it返回的是引用;it++返回的是臨時對象;–it同理。
原因:it++每次都要返回一個無用的臨時對象,所以每一次遍歷,你都進行了一次創(chuàng)建并銷毀對象的操作。(leetcode小本本記好了!)
總結(jié)
原文鏈接:https://blog.csdn.net/CSSDCC/article/details/122061679
相關(guān)推薦
- 2022-10-21 C++?move?semantic移動語義介紹_C 語言
- 2022-12-30 解決React報錯useNavigate()?may?be?used?only?in?context
- 2022-05-31 C?語言的弱符號與弱引用你了解嗎_C 語言
- 2022-01-10 微信小程序報錯 Cannot read property ‘forceUpdate‘ of u
- 2022-06-14 GO語言協(xié)程創(chuàng)建使用并通過channel解決資源競爭_Golang
- 2022-04-06 C語言中斐波那契數(shù)列的三種實現(xiàn)方式(遞歸、循環(huán)、矩陣)_C 語言
- 2022-09-17 python?pandas處理excel表格數(shù)據(jù)的常用方法總結(jié)_python
- 2022-10-17 Net?core中使用System.Drawing對上傳的圖片流進行壓縮(示例代碼)_實用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支