C++中使用vector.erase()需要注意的事項


本人菜鳥一枚。。

今天在用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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM