本人菜鸟一枚。。

今天在用vector.erase()的时候,发现总是不能把应该erase掉的东西erase干净。

举个栗子:

    vector<int> num_vec;
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back(); for (int i=; i<num_vec.size(); i++)
{
if (num_vec[i] == )
{
num_vec.erase(num_vec.begin()+i);
}
}

乍一看似乎没问题。

首先,用num_vec[i]而不用迭代器iterator可以避免出现“野指针”的问题,但是不知道二者性能上有没有差别;

其次,执行num_vec.erase(num_vec.begin()+i);操作后,num_vec中减少一个元素,这时num_vec[i]代表的将会是被删除元素的下一个元素,这样继续走下去似乎没有问题。

但是输出结果却是:1,3,5,6,5,5,9。

从结果可看出来,每次删除一个元素后,都会跳过下一个元素,继续执行。仔细一想,才发现执行下一次for循环时i++了,所以就跳过了一个元素。

因此在erase掉一个元素后,应该让i--才行。

正确代码如下:

    vector<int> num_vec;
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
num_vec.push_back();
for (int i=; i<num_vec.size(); i++)
{
if (num_vec[i] == )
{
num_vec.erase(num_vec.begin()+i);
i--;
}
}

输出结果为:1,3,6,9。

C++中使用vector.erase()需要注意的事项的更多相关文章

  1. MSDN 中 对vector::erase()的解释.xml

    pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9; ...

  2. 【转】vector中erase()的使用注意事项

    vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Whe ...

  3. C++ vector erase函数的使用注意事项

    最近使用了顺序容器的删除元素操作,特此记录下该函数的注意事项. 在C++primer中对c.erase(p) 这样解释的:  c.erase(p)    删除迭代器p所指向的元素,返回一个指向被删元素 ...

  4. vector的 emplace 和 insert 以及使用vector进行iterator遍历 且 erase的时候注意事项

    vector<int> first;//Size()==2 first.push_back(); first.push_back(); //first.insert(2); vector& ...

  5. vector::erase returns incompatible iterator in debug build

    关于std::vector中erase的用法http://www.cplusplus.com/reference/vector/vector/erase/ #include <vector> ...

  6. STL中的Vector相关用法

    STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...

  7. (转)C++ STL中的vector的内存分配与释放

    C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...

  8. C++STL中的vector的简单实用

    [原创] 使用C++STL中的vector, #include <stdio.h> #include<stdlib.h> #include<vector> usin ...

  9. vector.erase();vector.clear();map.erase();

    vector::erase()返回下一个iter: STL中的源码: //清除[first, last)中的所有元素 iterator erase(iterator first, iterator l ...

随机推荐

  1. Kotlin入门(30)多线程交互

    Android开发时常会遇到一些耗时的业务场景,比如后台批量处理数据.访问后端服务器接口等等,此时为了保证界面交互的及时响应,必须通过线程单独运行这些耗时任务.简单的线程可使用Thread类来启动,无 ...

  2. input输入限制,只允许输入数字和“.”,长度不得超过20

    <input style="margin-top: 10px;width: 100%;text-align:center;" id="removeArea" ...

  3. SQLServer之创建标量函数

    创建标量函数注意事项 在 SQL Server 和 Azure SQL Database 中创建用户定义函数. 用户定义函数是接受参数.执行操作(例如复杂计算)并将操作结果以值的形式返回的 Trans ...

  4. SQL Server 查看CPU情况

    --CPU相关视图 SELECT * FROM sys.dm_os_sys_info SELECT * FROM sys.dm_exec_sessions SELECT * FROM sys.sysp ...

  5. windows 与 Centos7 共享文件方法

    转自:https://www.cnblogs.com/zejin2008/p/7144514.html 先安装包依赖: yum -y install kernel-devel-$(uname -r) ...

  6. 在Centos7.2(64位)下搭建Web服务器

    一:通过Yum安装mysql 1 # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm 2 # rpm -i ...

  7. 研究好vif 和vshow

    另外从源头上处理的???,怎么自己排查出错误??必须 ??https://www.jb51.net/article/124116.htm

  8. IIS出现The specified module could not be found的解决方法

       1.打开IIS 信息服务,在左侧找到自己的计算机,点右键,选择属性,在主属性中选编辑,打开“目录安全性”选项卡,单击“匿名访问和验证控制”里的“编辑”按钮,在弹出的对话框中确保只选中了“匿名访问 ...

  9. Configuring High Availability and Consistency for Apache Kafka

    To achieve high availability and consistency targets, adjust the following parameters to meet your r ...

  10. linux vi粘贴格式易错乱

    对于一些冗长的代码完全可以粘贴的时候,vi粘贴所有格式全部错乱,完全无法阅读. 解决办法:esc进入命令行模式后,输入 :set paste,然后再i进入粘贴编辑模式,即可正常复制并保留原有格式-