由于最近项目使用中发现了之前对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. TRANSPOSE的DATA步实现

    data a; input name $ a b ; cards; x x x y y y ; run; %macro transpose; proc sql noprint ; select cou ...

  2. Git ——分布式版本控制系统

    Git ——分布式版本控制系统 本人git主页地址:https://github.com/lendoon/test.git git使用心得:初次接触git在课堂上,老师给我们提供了一个代码托管的场所, ...

  3. Promise学习

    转自:http://www.cnblogs.com/lvdabao/p/es6-promise-1.html 去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被 ...

  4. Ruby Cucumber环境

    1.http://rubyinstaller.org/downloads 下载rubyinstaller以及developmentkit(注意版本号要对应) 2.安装rubyinstaller以及解压 ...

  5. git 小结

    git cherry-pick de0ec64  可将另一个分支中的提交 cherry-pick到当前分支来

  6. SET-UID程序漏洞实验

    一.实验描述 Set-UID 是Unix系统中的一个重要的安全机制.当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程 ...

  7. CDS

    very nice artical talk about mergechangelog and cleardataset Delta and Data http://www.cnblogs.com/y ...

  8. JavaScript测试工具比较: QUnit, Jasmine, and Mocha

    1. QUnit A JavaScript Unit Testing framework. QUnit is a powerful, easy-to-use JavaScript unit testi ...

  9. goldengate studio 12.2.1.2.6发布

    主要特性: 1. 支持bigdata & teradata为目标端:

  10. odi 12.2.1.1新特性

    ODI 12.2.1.1现在已经发布,也可以OTN上下载,主要变化: Hyperion Essbase and Hyperion Planning 知识模块 Hyperion Essbase and ...