C++中關于set刪除的一些坑
前言
最近工作中需要使用平衡樹維護操作。遂調用了C++標準庫里的set,在確保解題思路沒有出錯的情況下,我發(fā)現(xiàn)自己始終有一組樣例無法通過。在檢查了很久的細節(jié)并找了標程對跑中間過程以后,我發(fā)現(xiàn)我在使用set做刪除的時候,迭代器發(fā)生了和我預想不一樣的變化。
我在一個函數(shù)中調用了set的erase操作來刪除某個迭代器,函數(shù)的傳入參數(shù)為要刪除的迭代器,類似如下
set<int> aha;
void del(set<int>::iterator it)
{
//一頓操作
aha.erase(it);
}
然后我在main中想要刪除一個迭代器,并左移一位或右移一位迭代器,類似如下
int main()
{
set<int>::iterator now;
//一頓操作
//操作1
now=aha.find(5);
del(now);
now--;
//操作2
now=aha.find(8);
del(now);
now++;
}
上面是我原來的寫法,刪除這個迭代器所在的位置,然后移位。
但理想很美好,現(xiàn)實有差距。在我用標程對拍以后,我發(fā)現(xiàn)上述操作存在很大問題。
使用erase操作刪除一個迭代器以后,我訪問該迭代器,他仍舊是原來的值。
但當我想要左右移位時,經測試發(fā)現(xiàn)不管你左移還是右移,他返回的都是刪除的迭代器在原set中的前一個位置。
也即
set<int>::iterator now=aha.find(8); del(now); /* 現(xiàn)在--now和++now都是同一個位置 為未刪除now的set中,now的前一個位置 */
了解這個就好辦了,我預先存下我要刪除的位置,然后迭代器先更新,再調用刪除即可。
這個主要還是對STL不夠熟悉造成的,為此,我后來還去翻閱了set中erase操作的函數(shù)原型及返回值。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關文章
VisualStudio2019解決scanf函數(shù)報錯問題
在 Visual Studio 2019 編輯代碼時,前期剛剛接觸到VS編譯器時存在的困惑,當用scanf()函數(shù),進行輸入時,在運行的時候編譯器會出現(xiàn)警告報錯,本文就來介紹一下解決方法2023-08-08

