vector使用篇之erase


由於最近項目使用中發現了之前對vector的一個誤區,由此發現自己對vect非常不了解,對此進行了一些了解,由此打算寫一下關於
vector使用方面的注意點,本篇先來講一下vector的erase功能,若有不對,盡請大家指出


首先寫了一個函數,用於打印vector內存情況,分別打印vector存儲數據內容及內存地址:
void printVec(vector<int> outputVec)
{
    if (!outputVec.empty())
    {
        int nSize = outputVec.size();
        for (int i = 0; i < nSize; i++)
        {
            printf_s("%d %d\r\n", outputVec.at(i), &(outputVec.at(i)));    
        }            
    }
    cin.get();    
}

 

然后我們開始測試vector的erase功能

我們先申請一個vector對象,並向其中壓入10個數據

vector<int> myVec;

cout<<"push_back VEC"<<endl;
for (int i = 0; i <10; i++)
{
    myVec.push_back(i);
}
printVec(myVec);

再將其按照錯誤的方式刪除,也就是我之前使用的方式
    vector<int>::iterator itePre;
    cout<<"erase VEC in wrong way"<<endl;    
    for (itePre = myVec.begin(); itePre != myVec.end(); itePre++)
    {
        myVec.erase(itePre);
    }
    printVec(myVec);
 
        
按我以前的理解,這樣的循環刪除方式預期的結果應該是會把vector中的數據清空,但是事實並非如此

事實會導致程序崩潰

因為itePre迭代器本身在被erase之后,是不可預測的,不應該再次被使用。

為此我修改了代碼如下:

    vector<int>::iterator itePre;
    cout<<"erase VEC in wrong way"<<endl;    
    for (itePre = myVec.begin(); itePre != myVec.end(); itePre++)
    {
        itePre = myVec.erase(itePre);
    }
    printVec(myVec);

得出的結果也並不是我想要的清空所有數據

而是只刪除了一半的數據,為什么呢?

 

因為在MSDN中,針對erase的返回值是這么描述的:

Return Value

An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists.

也就是說erase的返回值是返回被刪除元素向后的第一個元素,按照我的代碼,在刪除元素后的第一個元素下我又++了,那么就跳過了那一個元素,自然結果就不是我想要的。

因此我再次修改代碼如下:

   myVec.clear();

    cout<<"push_back VEC again"<<endl;
    for (int i = 0; i <10; i++)
    {
        myVec.push_back(i);
    }
    printVec(myVec);

    cout<<"erase VEC in right way"<<endl;    
    for (itePre = myVec.begin(); itePre != myVec.end();)
    {
        itePre = myVec.erase(itePre);
    }
    printVec(myVec);    

此次得到了我想要的結果:

 

 

 


 

 


免責聲明!

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



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