C++中關(guān)于set刪除的一些坑
前言
最近工作中需要使用平衡樹維護(hù)操作。遂調(diào)用了C++標(biāo)準(zhǔn)庫(kù)里的set,在確保解題思路沒(méi)有出錯(cuò)的情況下,我發(fā)現(xiàn)自己始終有一組樣例無(wú)法通過(guò)。在檢查了很久的細(xì)節(jié)并找了標(biāo)程對(duì)跑中間過(guò)程以后,我發(fā)現(xiàn)我在使用set做刪除的時(shí)候,迭代器發(fā)生了和我預(yù)想不一樣的變化。
我在一個(gè)函數(shù)中調(diào)用了set的erase操作來(lái)刪除某個(gè)迭代器,函數(shù)的傳入?yún)?shù)為要?jiǎng)h除的迭代器,類似如下
set<int> aha;
void del(set<int>::iterator it)
{
//一頓操作
aha.erase(it);
}
然后我在main中想要?jiǎng)h除一個(gè)迭代器,并左移一位或右移一位迭代器,類似如下
int main()
{
set<int>::iterator now;
//一頓操作
//操作1
now=aha.find(5);
del(now);
now--;
//操作2
now=aha.find(8);
del(now);
now++;
}
上面是我原來(lái)的寫法,刪除這個(gè)迭代器所在的位置,然后移位。
但理想很美好,現(xiàn)實(shí)有差距。在我用標(biāo)程對(duì)拍以后,我發(fā)現(xiàn)上述操作存在很大問(wèn)題。
使用erase操作刪除一個(gè)迭代器以后,我訪問(wèn)該迭代器,他仍舊是原來(lái)的值。
但當(dāng)我想要左右移位時(shí),經(jīng)測(cè)試發(fā)現(xiàn)不管你左移還是右移,他返回的都是刪除的迭代器在原set中的前一個(gè)位置。
也即
set<int>::iterator now=aha.find(8); del(now); /* 現(xiàn)在--now和++now都是同一個(gè)位置 為未刪除now的set中,now的前一個(gè)位置 */
了解這個(gè)就好辦了,我預(yù)先存下我要?jiǎng)h除的位置,然后迭代器先更新,再調(diào)用刪除即可。
這個(gè)主要還是對(duì)STL不夠熟悉造成的,為此,我后來(lái)還去翻閱了set中erase操作的函數(shù)原型及返回值。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- C++實(shí)現(xiàn)單張圖片讀取和保存
- c++讀取數(shù)據(jù)文件到數(shù)組的實(shí)例
- VC++實(shí)現(xiàn)文件與應(yīng)用程序關(guān)聯(lián)的方法(注冊(cè)表修改)
- C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法
- 利用C++如何覆蓋或刪除指定位置的文件內(nèi)容
- C++如何刪除map容器中指定值的元素詳解
- 淺談c++ vector和map的遍歷和刪除對(duì)象
- 詳解在C++中顯式默認(rèn)設(shè)置的函數(shù)和已刪除的函數(shù)的方法
- C++刪除指定文件夾下N天及之前日志文件的方法
- C++遞歸刪除一個(gè)目錄實(shí)例
- C++ vector刪除符合條件的元素示例分享
- C++操作文件進(jìn)行讀取、刪除、修改指定行
相關(guān)文章
c++ chrono 獲取當(dāng)前時(shí)間的實(shí)現(xiàn)代碼
這篇文章主要介紹了c++ chrono 獲取當(dāng)前時(shí)間的實(shí)現(xiàn)代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Qt TCP實(shí)現(xiàn)簡(jiǎn)單通信功能
這篇文章主要為大家詳細(xì)介紹了Qt TCP實(shí)現(xiàn)簡(jiǎn)單通信功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
使用C語(yǔ)言實(shí)現(xiàn)本地socke通訊的方法
這篇文章主要介紹了?使用C語(yǔ)言實(shí)現(xiàn)本地socke通訊,代碼分為服務(wù)器代碼和客戶端代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
C語(yǔ)言中while與do-while的介紹與注意事項(xiàng)
對(duì)于C語(yǔ)言中的while與do-while,相信很多都再熟悉不過(guò)了,最近在工作中就用到了,所以想著總結(jié)一下,方便自己或者有需要的朋友們參考借鑒,文中通過(guò)示例代碼介紹的很詳細(xì),感興趣的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-10-10
VisualStudio2019解決scanf函數(shù)報(bào)錯(cuò)問(wèn)題
在 Visual Studio 2019 編輯代碼時(shí),前期剛剛接觸到VS編譯器時(shí)存在的困惑,當(dāng)用scanf()函數(shù),進(jìn)行輸入時(shí),在運(yùn)行的時(shí)候編譯器會(huì)出現(xiàn)警告報(bào)錯(cuò),本文就來(lái)介紹一下解決方法2023-08-08
Cocos2dx實(shí)現(xiàn)數(shù)字跳動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Cocos2dx實(shí)現(xiàn)數(shù)字跳動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09

