網站首頁 編程語言 正文
??在vector數組中我們刪除數組經常用的就是erase方法,但是earse的用法一不注意就會出錯,今天我就遇到了,所以在這里總結一下,避免大家用錯。
1、首先介紹一下erase函數的原型:
iteratorerase(iterator position); iteratorerase(iterator first, iterator last);
我們可以看到erase函數有兩種函數原型,一種是給定要刪除的位置,另一種是給定刪除的區域。
2、接下來給出一種常見的錯誤
for(auto iter=vec.begin();iter!=vec.end(); iter++) { if(*iter == 3) veci.erase(iter); }
??這里面隱藏著一個很嚴重的錯誤:當veci.erase(iter)之后,iter就變成了一個野指針,對一個野指針進行 iter++ 是肯定會出錯的。
??我們通過查閱文檔可以看到erase函數的返回值是這么介紹的:一個迭代器,指定在任何刪除的元素之后剩余的第一個元素,如果不存在這樣的元素,則指定指向向量結尾的指針
將代碼改成這樣就可以了:
for(auto iter=vec.begin();iter!=vec.end(); iter++) { if(*iter == 3) iter = veci.erase(iter); }
??但是這種代碼也是存在缺陷的,首先是我們無法連續刪除數字3,其次是迭代器在指向vec.end()的時候,還會進行一次++,這就發生了數組越界,所以我們一概這樣修改:
for(auto iter=vec.begin();iter!=vec.end(); ) { if( *iter == 3) iter = veci.erase(iter);//當刪除時erase函數自動指向下一個位置,就不需要進行++ else iter ++ ; //當沒有進行刪除的時候,迭代器++ }
另一種解決無法刪除連續的數字的方法
我們先介紹一下remove函數:remove是個stl的通用算法std::remove(first,last,val)移除[first, last)范圍內等于val的元素在vector里面用就類似于 iter=std::remove(vec.begin(), vec.end(), val)但這個函數只是把val移到vec的末尾,并不真正刪除,真正刪除還是要調用一次erase函數
veci.erase(remove(vec.begin(),vec.end(),3),vec.end());
3、刪除重復元素,并且順序不發生變化
??如果不要求順序的話,我們可以直接調用unique函數進行操作,這里介紹一下unique函數:從頭到尾,判斷當前元素是否等于上一個元素,將不重復的元素移到前面來(賦值操作),而不是將重復的元素移動到后面去。
函數的參數是:
first:去重的起點的迭代器位置。
last:去重的終點的迭代器位置,不包括
pred:自定義判斷重復方式。
返回值:去重以后vector中沒有重復元素的下一個位置的迭代器。
vec.erase(unique(vec.begin(),vec.end()),vec.end()) //將重復的區域刪除
但是如果要求數字順序不能發生變化呢?
這里有兩種做法:
第一種:我們直接對vector數組本身進行操作
這里我們介紹一下find()函數:函數有3個參數,前兩個規定了找的區域,第三個是要找的數字。如果找到,返回其迭代器,找不到返回-1
void fun(vector<int>& vec) { for(auto iter=vec.begin(); iter!=vec.end();) { auto iter1=find(vec.begin(),iter,*iter); if(iter!=iter1) //判斷是否重復,如果兩者相等說明沒有重復 { iter = vec.erase(iter); } else iter++; } }
第二種:創建一個vector來存放沒有重復的元素
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); } } }
總結:
??erase()函數的用法: erase()函數用于在順序型容器中刪除容器的一個元素,有兩種函數原型,c.erase (p ),c.erase(b,e);第一個刪除迭代器p所指向的元素,第二個刪除迭代器b,e所標記的范圍內的元素,c為容器對象,返回值都是一個迭代器,該迭代器指向被刪除元素后面的元素(這個是重點)
原文鏈接:https://blog.csdn.net/Vcrossover/article/details/106243627
相關推薦
- 2022-11-27 C++常見的stl容器與相關操作?示例解析_C 語言
- 2023-02-14 OKhttp攔截器實現實踐環節源碼解析_Android
- 2022-07-11 python連接clickhouse的端口問題及解決_python
- 2022-04-17 使用css漸變色。實現動態進度條效果
- 2022-10-27 React的createElement和render手寫實現示例_React
- 2022-08-04 Django框架之路由用法_python
- 2022-04-08 iOS實現計算器小功能_IOS
- 2022-11-03 Python?pandas中apply函數簡介以及用法詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支