由于最近项目使用中发现了之前对vector的一个误区,由此发现自己对vect非常不了解,对此进行了一些了解,由此打算写一下关于
vector使用方面的注意点,本篇先来讲一下vector的erase功能,若有不对,尽请大家指出 首先写了一个函数,用于打印vector内存情况,分别打印vector存储数据内容及内存地址:
void printVec(vector<int> outputVec)
{
if (!outputVec.empty())
{
int nSize = outputVec.size();
for (int i = ; 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 = ; i <; 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 = ; i <; 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);

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

 

 

vector使用篇之erase的更多相关文章

  1. vector.erase();vector.clear();map.erase();

    vector::erase()返回下一个iter: STL中的源码: //清除[first, last)中的所有元素 iterator erase(iterator first, iterator l ...

  2. vector的 emplace 和 insert 以及使用vector进行iterator遍历 且 erase的时候注意事项

    vector<int> first;//Size()==2 first.push_back(); first.push_back(); //first.insert(2); vector& ...

  3. vector中erase用法注意事项

    以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...

  4. 【C++基金会 04】vector详细解释

    根据写博客开始总有一些事情的习惯,加鸡汤文,今天请原谅我记得. ============================================= 今天要写的内容是顺序型容器.首先,标准库定义 ...

  5. 杭电2014 (第一次用vector ac题目)

    早就想用容器类来实现一些编程,今天也算是学了一点吧. vector的使用方法参考了某位博主的一篇文章,感觉写得还是不错的:http://blog.csdn.net/always2015/article ...

  6. vector、deque、stack、queue、list以及set的使用

    注意:以下测试案例都要加上相应的头文件,必要时要加上algorithm文件. 1.vector 连续存储结构,每个元素在内存上是连续的:支持高效的随机访问和在尾端插入/删除操作,但其他位置的插入/删除 ...

  7. 关于map::erase的使用说明

    C++ 中经常使用的容器类有vector,list,map.其中vector和list的erase都是返回迭代器,但是map就比较不一样. 当在循环体中使用map::erase语句时,为了能够在任何机 ...

  8. C++ STL基本容器的使用(vector、list、deque、map、stack、queue)

    1.关联容器和顺序容器 C++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector.list.deque等.关联容器主要有map和set.如下图: 1.vector基本使用 #incl ...

  9. 在容器中使用erase函数,迭代器的处理

    在c++编程中,用到迭代器的时候,往往不知道如何删除当前迭代器指向的元素. erase函数:   返回下一个迭代器. 只使用vector的erase函数,记住,该函数是迭代器失效,返回下一个迭代器. ...

随机推荐

  1. PL/SQL Developer记住用户名密码

    在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:PL/SQL Developer ->tools-> ...

  2. [小菜随笔]关于monkey报错日志分析

    今天小菜在一个测试群内看到群友发出一个monkey的报错信息,其实是一个很简单的报错 个人觉得monkey虽然操作起来比较简易,但其实查看日志分析日志也是很重要的环节,如果对错误分析不够详细,就容易误 ...

  3. JAVA多线程超时加载当网页图片

    先上图: 这一次没有采取正则匹配,而采取了最简单的java分割和替代方法进行筛选图片 它能够筛选如下的图片并保存到指定的文件夹 如: “http://xxxx/xxxx/xxx.jpg” 'http: ...

  4. VMware Workstation安装MAC OS X系统

    http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html

  5. [linux-内核][转]内核日志及printk结构浅析

    这段时间复习了一下内核调试系统,注意看了一下printk的实现以及内核日志的相关知识,这里做一下总结. 1.问题的引出: 做DPDK项目时,调试rte_kni.ko时,发现printk并不会向我们想想 ...

  6. strace命令使用

    在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用.当你想知道程序和操作系统如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执行. 这个简单而又强大的工具几 ...

  7. rails 常用的验证方法 validates (转)

    Agile Web Development with Rails 17.4 validation validate              在save的时候激活validate_on_create  ...

  8. 关于 QImage::Format_Mono

    QImage::Format_Mono 为通常所讲的位图模式, QT中本提供了 QBitmap 来作为位图相关的应用, 但其最大弊端在于无法操作图片中 pixel 本身或说相关方法太过繁琐. Mono ...

  9. cocoapod安装过程中的幺蛾子

    cocoapod是GoogleMobileAd framework推荐的一个自动解决依赖关系的工具.   安装cocoapod时遇到问题: EthandeMacBook-Air:Xcode ethan ...

  10. 运行带cocoa pods 的项目,遇到的问题是找不到文件,解决办法

    打开终端,进入项目所在的目录,也就是和Podfile在同一目录下,输入以下命令(由于已经有Podfile,所以不需要再创建Podfile):  pod update 过几秒(也许需要十几秒,取决于你的 ...