最近,在看書的時候,偶然間發現一個細節:就是vector的erase操作。對於這個erase操作,大家都清楚,這個刪除操作有2種形式,(1)刪除單一元素,參數是迭代器變數;(2)刪除區間元素,參數是begin和end。而細節就是在刪除單一元素的時候,發生的具體事情。
例如:有一個vector,是這樣初始化的,vector
通常程式碼是這樣寫的:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); for (auto i = va.begin();i != va.end(); i++) { if (*i == 4) { i = va.erase(i); } } for (auto i : va) { std::cout << i << " "; } return 0; }
乍看之下並無不妥之處,然而結果卻出乎意料
為什麼結果會是這樣呢?仔細想想了,原來是在刪除的地方出了錯誤,當if條件成立之後,vector進行刪除操作,刪除掉vector中符合條件的元素,重點來了,當vecotr執行erase操作的之後,返回的值表示目前被刪除迭代器的下一個位置,注意,是下一個位置,然後,當再次循環的是,迭代器又向後移動了一個位置,導致接下來相同的元素並沒有被刪除。
附上正確寫法:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); auto iter = vb.begin(); while(iter!=vb.end()) { if (iter != vb.end()) { if (*iter == 4) { iter = vb.erase(iter); } else { iter++; } } } for (auto j : vb) { std::cout << j << " "; } return 0; }
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; for (auto i = va.begin();i != va.end(); ) { if (*i == 4) { i = va.erase(i); } else { i++; } } for (auto i : va) { std::cout << i << " "; } return 0; }