網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
??在vector數(shù)組中我們刪除數(shù)組經(jīng)常用的就是erase方法,但是earse的用法一不注意就會(huì)出錯(cuò),今天我就遇到了,所以在這里總結(jié)一下,避免大家用錯(cuò)。
1、首先介紹一下erase函數(shù)的原型:
iteratorerase(iterator position); iteratorerase(iterator first, iterator last);
我們可以看到erase函數(shù)有兩種函數(shù)原型,一種是給定要?jiǎng)h除的位置,另一種是給定刪除的區(qū)域。
2、接下來(lái)給出一種常見(jiàn)的錯(cuò)誤
for(auto iter=vec.begin();iter!=vec.end(); iter++) { if(*iter == 3) veci.erase(iter); }
??這里面隱藏著一個(gè)很?chē)?yán)重的錯(cuò)誤:當(dāng)veci.erase(iter)之后,iter就變成了一個(gè)野指針,對(duì)一個(gè)野指針進(jìn)行 iter++ 是肯定會(huì)出錯(cuò)的。
??我們通過(guò)查閱文檔可以看到erase函數(shù)的返回值是這么介紹的:一個(gè)迭代器,指定在任何刪除的元素之后剩余的第一個(gè)元素,如果不存在這樣的元素,則指定指向向量結(jié)尾的指針
將代碼改成這樣就可以了:
for(auto iter=vec.begin();iter!=vec.end(); iter++) { if(*iter == 3) iter = veci.erase(iter); }
??但是這種代碼也是存在缺陷的,首先是我們無(wú)法連續(xù)刪除數(shù)字3,其次是迭代器在指向vec.end()的時(shí)候,還會(huì)進(jìn)行一次++,這就發(fā)生了數(shù)組越界,所以我們一概這樣修改:
for(auto iter=vec.begin();iter!=vec.end(); ) { if( *iter == 3) iter = veci.erase(iter);//當(dāng)刪除時(shí)erase函數(shù)自動(dòng)指向下一個(gè)位置,就不需要進(jìn)行++ else iter ++ ; //當(dāng)沒(méi)有進(jìn)行刪除的時(shí)候,迭代器++ }
另一種解決無(wú)法刪除連續(xù)的數(shù)字的方法
我們先介紹一下remove函數(shù):remove是個(gè)stl的通用算法std::remove(first,last,val)移除[first, last)范圍內(nèi)等于val的元素在vector里面用就類(lèi)似于 iter=std::remove(vec.begin(), vec.end(), val)但這個(gè)函數(shù)只是把val移到vec的末尾,并不真正刪除,真正刪除還是要調(diào)用一次erase函數(shù)
veci.erase(remove(vec.begin(),vec.end(),3),vec.end());
3、刪除重復(fù)元素,并且順序不發(fā)生變化
??如果不要求順序的話,我們可以直接調(diào)用unique函數(shù)進(jìn)行操作,這里介紹一下unique函數(shù):從頭到尾,判斷當(dāng)前元素是否等于上一個(gè)元素,將不重復(fù)的元素移到前面來(lái)(賦值操作),而不是將重復(fù)的元素移動(dòng)到后面去。
函數(shù)的參數(shù)是:
first:去重的起點(diǎn)的迭代器位置。
last:去重的終點(diǎn)的迭代器位置,不包括
pred:自定義判斷重復(fù)方式。
返回值:去重以后vector中沒(méi)有重復(fù)元素的下一個(gè)位置的迭代器。
vec.erase(unique(vec.begin(),vec.end()),vec.end()) //將重復(fù)的區(qū)域刪除
但是如果要求數(shù)字順序不能發(fā)生變化呢?
這里有兩種做法:
第一種:我們直接對(duì)vector數(shù)組本身進(jìn)行操作
這里我們介紹一下find()函數(shù):函數(shù)有3個(gè)參數(shù),前兩個(gè)規(guī)定了找的區(qū)域,第三個(gè)是要找的數(shù)字。如果找到,返回其迭代器,找不到返回-1
void fun(vector<int>& vec) { for(auto iter=vec.begin(); iter!=vec.end();) { auto iter1=find(vec.begin(),iter,*iter); if(iter!=iter1) //判斷是否重復(fù),如果兩者相等說(shuō)明沒(méi)有重復(fù) { iter = vec.erase(iter); } else iter++; } }
第二種:創(chuàng)建一個(gè)vector來(lái)存放沒(méi)有重復(fù)的元素
vector<int> fun(vector<int>& vec) { vector<int> temp; for(auto iter=vec.begin(); iter!=vec.end(); iter++;) { auto iter1=find(vec.begin(),iter,*iter); if(iter==iter1) { temp.push_back(*iter); } } }
總結(jié):
??erase()函數(shù)的用法: erase()函數(shù)用于在順序型容器中刪除容器的一個(gè)元素,有兩種函數(shù)原型,c.erase (p ),c.erase(b,e);第一個(gè)刪除迭代器p所指向的元素,第二個(gè)刪除迭代器b,e所標(biāo)記的范圍內(nèi)的元素,c為容器對(duì)象,返回值都是一個(gè)迭代器,該迭代器指向被刪除元素后面的元素(這個(gè)是重點(diǎn))
原文鏈接:https://blog.csdn.net/Vcrossover/article/details/106243627
相關(guān)推薦
- 2023-05-29 scipy稀疏數(shù)組coo_array的實(shí)現(xiàn)_python
- 2023-10-26 解決問(wèn)題:NODE_ENV 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序,或者批處理文件
- 2022-01-22 HTML5新增標(biāo)簽
- 2022-10-26 Google?Kubernetes?Engine?集群實(shí)戰(zhàn)詳解_云其它
- 2022-04-10 新版Microsoft Edge關(guān)閉平滑滾動(dòng),類(lèi)似chrome效果
- 2022-10-21 使用react+redux實(shí)現(xiàn)彈出框案例_React
- 2022-09-05 C語(yǔ)言之關(guān)于二維數(shù)組在函數(shù)中的調(diào)用問(wèn)題_C 語(yǔ)言
- 2022-10-10 redis緩存延時(shí)雙刪的原因分析_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支