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);    

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

 

 

 


 

 

posted on 2016-08-30 09:36  NeilWan  阅读(5769)  评论(0编辑  收藏  举报

导航