程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> vector使用篇之erase,vectorerase

vector使用篇之erase,vectorerase

編輯:C++入門知識

vector使用篇之erase,vectorerase


由於最近項目使用中發現了之前對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);    

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

 

 

 


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved