本人菜鳥一枚。。
今天在用vector.erase()的時候,發現總是不能把應該erase掉的東西erase干凈。
舉個栗子:
vector<int> num_vec; num_vec.push_back(1); num_vec.push_back(3); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(6); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(9); for (int i=0; i<num_vec.size(); i++) { if (num_vec[i] == 5) { num_vec.erase(num_vec.begin()+i); } }
乍一看似乎沒問題。
首先,用num_vec[i]而不用迭代器iterator可以避免出現“野指針”的問題,但是不知道二者性能上有沒有差別;
其次,執行num_vec.erase(num_vec.begin()+i);操作后,num_vec中減少一個元素,這時num_vec[i]代表的將會是被刪除元素的下一個元素,這樣繼續走下去似乎沒有問題。
但是輸出結果卻是:1,3,5,6,5,5,9。
從結果可看出來,每次刪除一個元素后,都會跳過下一個元素,繼續執行。仔細一想,才發現執行下一次for循環時i++了,所以就跳過了一個元素。
因此在erase掉一個元素后,應該讓i--才行。
正確代碼如下:
vector<int> num_vec; num_vec.push_back(1); num_vec.push_back(3); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(6); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(9); for (int i=0; i<num_vec.size(); i++) { if (num_vec[i] == 5) { num_vec.erase(num_vec.begin()+i); i--; } }
輸出結果為:1,3,6,9。
