vector使用篇之erase
由于最近项目使用中发现了之前对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的更多相关文章
- vector.erase();vector.clear();map.erase();
vector::erase()返回下一个iter: STL中的源码: //清除[first, last)中的所有元素 iterator erase(iterator first, iterator l ...
- vector的 emplace 和 insert 以及使用vector进行iterator遍历 且 erase的时候注意事项
vector<int> first;//Size()==2 first.push_back(); first.push_back(); //first.insert(2); vector& ...
- vector中erase用法注意事项
以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...
- 【C++基金会 04】vector详细解释
根据写博客开始总有一些事情的习惯,加鸡汤文,今天请原谅我记得. ============================================= 今天要写的内容是顺序型容器.首先,标准库定义 ...
- 杭电2014 (第一次用vector ac题目)
早就想用容器类来实现一些编程,今天也算是学了一点吧. vector的使用方法参考了某位博主的一篇文章,感觉写得还是不错的:http://blog.csdn.net/always2015/article ...
- vector、deque、stack、queue、list以及set的使用
注意:以下测试案例都要加上相应的头文件,必要时要加上algorithm文件. 1.vector 连续存储结构,每个元素在内存上是连续的:支持高效的随机访问和在尾端插入/删除操作,但其他位置的插入/删除 ...
- 关于map::erase的使用说明
C++ 中经常使用的容器类有vector,list,map.其中vector和list的erase都是返回迭代器,但是map就比较不一样. 当在循环体中使用map::erase语句时,为了能够在任何机 ...
- C++ STL基本容器的使用(vector、list、deque、map、stack、queue)
1.关联容器和顺序容器 C++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector.list.deque等.关联容器主要有map和set.如下图: 1.vector基本使用 #incl ...
- 在容器中使用erase函数,迭代器的处理
在c++编程中,用到迭代器的时候,往往不知道如何删除当前迭代器指向的元素. erase函数: 返回下一个迭代器. 只使用vector的erase函数,记住,该函数是迭代器失效,返回下一个迭代器. ...
随机推荐
- Adapter 启动时报错
如果把Adapter安装到C盘,有时在启动Adapter的时候会抛出java.io.IOException: Cannot run program "C:\tibco\adapter\adr ...
- js只保留整数,向上取整,四舍五入,向下取整等函数
1.丢弃小数部分,保留整数部分 parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3.四舍五入. Math.round(5/2) 4.向下取整 Math.f ...
- Git ——分布式版本控制系统
Git ——分布式版本控制系统 本人git主页地址:https://github.com/lendoon/test.git git使用心得:初次接触git在课堂上,老师给我们提供了一个代码托管的场所, ...
- android editText 监听事件
在软键盘中注意 在监听的 edittext中 使用android:imeOptions属性的时候,一定要对EditText设置 android:inputType 或者 设置 android:sing ...
- 跨域资源共享(CORS)问题解决方案
CORS:Cross-Origin Resource Sharing(跨域资源共享) CORS被浏览器支持的版本情况如下:Chrome 3+.IE 8+.Firefox 3.5+.Opera 12+. ...
- 2014优秀的好用的20款免费jQuery插件推荐
2013 年最好的 20 款免费 jQuery 插件,世界买家网 www.buyerinfo.biz在这里分享给大家 这些插件对设计者和开发者都有很大的帮助,希望大家能够喜欢:) 现 今互联网市场上提 ...
- GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合
此贴为标记贴 方便下次使用 在项目需求中原本是用ScrollView来进行整个页面的滑动,ScrollView里面包含的有图片轮播,文字轮播,与2列GridView的item 问题 使用原生的Grid ...
- 利用border-radious画图形
今天才发现,border-radius可以画很多图形,下面跟我来看一下吧: 在设有宽和高的情况下画一个圆: #div1{ /*宽高相等,圆角范围为高或宽的一半或以上*/ background-colo ...
- Spark的Straggler深入学习(2):思考Block和Partition的划分问题——以论文为参考
一.partition的划分问题 如何划分partition对block数据的收集有很大影响.如果需要根据block来加速task的执行,partition应该满足什么条件? 参考思路1:range ...
- Python学习路程-常用设计模式学习
本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复 ...