zoukankan      html  css  js  c++  java
  • 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
    ", 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);    

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

     


     
  • 相关阅读:
    数据库多表查询
    链表的经典习题
    数据库基本概念及简单的单表操作
    Categrory
    2021春招冲刺练习目录
    2012春招冲刺-01.01 关于Cookie、什么是闭包、BFC与盒模型
    2021春招冲刺
    JS中bind,call,apply以及new的用法与实现
    2021春招冲刺-12.30 POST与GET | JS异步任务 | 判断变量类型
    2021春招冲刺-12.29-算法、原型与原型链、文档流
  • 原文地址:https://www.cnblogs.com/NeilWan/p/5820499.html
Copyright © 2011-2022 走看看