C/C++知识点之vector使用篇erase
小标 2018-08-10 来源 : 阅读 1141 评论 0

摘要:本文主要向大家介绍了C/C++知识点之vector使用篇erase,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之vector使用篇erase,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

  
  由于最近项目使用中发现了之前对vector的一个误区,由此发现自己对vect非常不了解,对此进行了一些了解,由此打算写一下关于vector使用方面的注意点,本篇先来讲一下vector的erase功能,若有不对,尽请大家指出首先写了一个函数,用于打印vector内存情况,分别打印vector存储数据内容及内存地址:

void printVec(vector 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 myVec;

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


再将其按照错误的方式删除,也就是我之前使用的方式

    vector::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::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);    
本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程