由于最近项目使用中发现了之前对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. Listview中显示不同的视图布局

    import java.util.ArrayList; import android.app.Activity;import android.content.Context;import androi ...

  2. [转载]Three Trending Computer Vision Research Areas, 从CVPR看接下来几年的CV的发展趋势

    As I walked through the large poster-filled hall at CVPR 2013, I asked myself, “Quo vadis Computer V ...

  3. mysql的卸载方法

    sudo rm /var/lib/mysql/ -R 删除mysql的数据文件 2 sudo rm /etc/mysql/ -R 删除mqsql的配置文件 3 sudo apt-get autorem ...

  4. SQL 常用函数

    --将字符串中从某个字符开始截取一段字符,然后将另外一个字符串插入此处  select stuff('hi,world!',4,4,'****') --返回值hel****orld!  --返回从指定 ...

  5. 基于H5的移动端开发,window.location.href在IOS系统无法触发问题

    最近负责公司的微信公众号开发项目,基于H5进行开发,某些页面window.location.href在Android机上能正常运行而IOS系统上无法运行,导致无法重定向到指定页面,查了好久终于找到方法 ...

  6. cocoapods无法使用(mac os 10.11升级导致pod: command not found)

    之前安装了cocoapods, 那么输入 : sudo gem install -n /usr/local/bin cocoapods 如果还不行的话 首先在终端输入 gem sources -l 查 ...

  7. 黑马程序员——C语言基础 内存剖析

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)进制 进制是一种计数的方式,数值的表示形式.有多种进制十进制.二进制 ...

  8. RGB与16进制颜色转换的原理

    Integer有进制转换的方法.也可以自己写进制转换的方法.

  9. web前端基础篇⑩

    1.960栅格式布局法屏幕分辨率为1024*768.采用接 main宽为960px的布局方式12列式:每格60px 间距20px 3 6 3版 三格式布局(最常用)16列式:每格40px 间距20px ...

  10. c++虚函数和内联构造函数

    创建一个含有虚函数的对象时, 编译器会实现 "初始化其VPTR以指向相应的VTABLE" 这个操作 ,而实现这个操作是通过 "插入隐藏代码至构造函数中" 故此时 ...