今天在删除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. 嵌入式 hi3518平台获取网络环境中的ip、netmask、broadcast等信息

    <span style="font-family:Courier New;"> /********************************** (C) COPY ...

  2. PHP开发规范

    十.开发规范下面我们讲解 Yii 编程中推荐的开发规范.为简单起见,我们假设 WebRoot 是 Yii 应用安装的目录.1.URL默认情况下,Yii 识别如下格式的 URL: http://host ...

  3. 【转】linux dumpe2fs命令

    转自:http://www.shellcn.net/linux_command/linux_dumpe2fs.html 命令名称 dumpe2fs - 显示ext2/ext3/ext4文件系统信息. ...

  4. CH340在STM32实现一键下载电路

    在做基于STM32的多功能MP3播放器的课题时,在程序下载这部分时借鉴了正点原子开发板上的一键下载电路,采用CH340G这款芯片设计. 在画PCB初期原理图部分,对采用CH340G设计的一键下载电路不 ...

  5. unity3d Hair real time rendering 真实头发实时渲染(转)

    惊现塞拉酱 算法是Weta Digital根据siggraph2003的论文加以改进,改进之前使用的是Kajiya and Kay’s 模型,它能量不守恒,也就是说不是基于物理的,不准确 电镜下真实头 ...

  6. 【重读】The C++ Programming Language/C++编程语言(一)

    最近在写C++系列的文章,翻出以前看过的 C++之父Bjarne Stroustrup的书.再一次,竟然又有新的领悟.现在看来,这不是一本只讲C++的书,对于程序设计/开发,以及如何学习开发知识都有所 ...

  7. 关系数据库&&NoSQL数据库

    在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发.因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库. ...

  8. windows创建虚拟界面

    定义 VDesktopName: PAnsiChar; //虚拟桌面名 VDesktop: HDESK; //虚拟桌面   创建 VDesktopName := 'MYDESK'; VDesktop ...

  9. yum 安装 php5.6 和 mysql5.6

    安装 PHP rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm; rpm - ...

  10. 2016 CCPC 杭州站 小结

    5题倒数第一,铜……(我就知道我们很稳!!!哼!! 这一次心态完全爆炸 开场我就没有按照平时的顺序读题 然后zr的A题wa 我F题T xl说B是一个最小生成树,又说是最小树形图,不会写 K题完全没思路 ...