今天在删除vector中的元素中遇到一个问题,这里记录下来以便以后查阅。

预备知识:用到了erase()函数,对于一个容器c来说,假设迭代器为p,那么执行:

c.erase(p)之后就删除了容器c中p所指向的元素,并且返回一个迭代器,返回的迭代器指向刚才所删除元素后面的一个元素(这里是关键)!

有了上面的知识后,我编写了下面的代码(头文件略去),删去矢量vals中的1:

 int main()
{
vector<int> vals;
vals.push_back();
vals.push_back();
vals.push_back();
vals.push_back();
vals.push_back();
vals.push_back();
vals.push_back();
vals.push_back(); vector<int>::iterator itr = vals.begin(); while ( itr != vals.end())
{
if ( == *itr)
{
vals.erase(itr);
}
else
++itr;
}
itr = vals.begin(); while(itr != vals.end())
{
cout << *itr << endl;
itr++;
}
return ;
}

编译通过,但是调试就报错:

所以我进行了断点调试,发现第一个1可以成功删除,但是第二次试图遍历vals的时候,就会报错,看半天代码,无果,在网上搜了一些帖子,终于知道,原来,容器在删除或者插入一个元素之后,原来的迭代器会失效,于是第二次遍历时的判断条件还继续用原来的迭代器,系统无法判断是什么东西,于是报错,怎么解决呢?但是C++设计者早就为我们铺好了路,虽然erase()使得原来的迭代器失效了,但是上面说过,erase()会返回一个迭代器,返回的迭代器指向刚才所删除元素后面的一个元素,于是我们就要利用好这个返回的迭代器,更改代码如下:

就是把上面代码中的第19行改为:

itr = vals.erase(itr);

这样,原来的迭代器失效了,但是返回的迭代器又重新赋给了itr,于是工作可以继续了,运行结果如下:

所以说看一百遍不如自己亲自实践一遍,看似简单的问题,没想到花了如此长的时间,事无巨细,实践为真!

C++之vector中元素删除的更多相关文章

  1. 对于vector中高效删除中间元素的技巧

    众所周知,vector是连续存储空间,只提供高效的尾部删除方法pop_back() ,在中间删除的效率很低,那么如果大家想快速删除中间元素该如何实现? 话不多说,看代码: //移除vector元素,最 ...

  2. 【转】java.util.vector中的vector的详细用法

    [转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...

  3. java.util.vector中的vector的详细用法

    ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创 ...

  4. 【C++】Vector判断元素是否存在,去重,求交集,求并集

    1 #include <iostream> 2 #include <vector> 3 #include <algorithm> //sort函数.交并补函数 4 ...

  5. vector中的元素删除

    删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! ...

  6. vector中删除的注意事项

    erase的函数原型有两种形式: iterator erase(iterator position); iterator erase(iterator first, iterator last); 例 ...

  7. STL—— 容器(vector)元素的删除

    1. clear() 将整个 vector 都删除 使用 vectorname.clear() 可以将整个vector 中的元素全部删除,但是内存不会释放,如下代码: 1 #include <i ...

  8. Perl删除数组中元素的多种方法

    Perl中的数组元素起始引用序号为0,@array的第一个元素为$array[0],依次递增,最后一个元素为$array[-1]或者$#array.如果要删除一个数组中已有的元素,可以用以下几个函数来 ...

  9. Java中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...

随机推荐

  1. hdu 4301(基本dp)

    题意:就是给你一块2*n的巧克力,让你把它分成x块,并且每一个单位的巧克力各不相同,问有多少种分法? 分析:用dp[i][j][k],表示到巧克力的第二列时,巧克力被分成了j快,k用来表示第i列上下两 ...

  2. [再寄小读者之数学篇](2014-11-19 $\tan x/x$ 在 $(0,\pi/2)$ 上递增)

    $$\bex \frac{\tan x}{x}\nearrow. \eex$$ Ref. [Proof Without Words: Monotonicity of $\tan x/x$ on $(0 ...

  3. os和os.path模块

    Os和os.path模块函数 1.      Os模块 函数 描述 文件处理 Mkfifo()/mknod() 创建命名管道/创建文件系统节点 Remove()/unlink() 删除文件 Renam ...

  4. md5加密算法c语言版

    from: http://blog.sina.com.cn/s/blog_693de6100101kcu6.html 注:以下是md5加密算法c语言版(16/32位) ---------------- ...

  5. 设计模式 工厂-Factory

    在开始笔记之前先推荐一个网站:http://design-patterns.readthedocs.org/zh_CN/latest/index.html 网站对每一个Pattern都有详尽的解说.并 ...

  6. Ubuntu 下一个可用的音乐播放器

    参考:http://www.pairsdoll.com/install-audacious-music-palyer-in-ubuntu.html/ 方法:打开terminal,sudo apt-ge ...

  7. MSSQL 2005数据库可疑状态

    今天早上打开进销存,提示链接失败,经过检查参数,网络.端口等各种情况,均没有发现问题,最后检查数据库本事的问题. 通过studio进去发现我的进销存数据变成了(可疑)状态,随机百度修复方法,修复方法还 ...

  8. rapsbian下配置ngrok

    访问https://ngrok.com,下载Linux/ARM版本的(因为PI为ARM的芯片,如果下载Linux版本的是无法正常使用的) 解压 $ unzip /path/to/ngrok.zip 注 ...

  9. Maven+Spring Batch+Apache Commons VF学习

    Apache Commons VFS资料:例子:http://www.zihou.me/html/2011/04/12/3377.html详细例子:http://p7engqingyang.iteye ...

  10. POJ1469COURSES(二分图匹配)

    裸的二分图匹配 题目poj.org/problem?id=1469 不解释: