C++ 的erase和remove remove_if删除元素

摘要:
=矢量int.end();){if{iter=vec_int.erase;}else{++iter;}for{printf;}但是从MSDN中,我们可以看到erase不是以这种方式使用vectorv1;vector<int>::迭代器Iter;v1.推回;v1.推回;v1.推回;v1.推回;v1.推回;cout˂˂“v1=”;for(Iter=v1.begin();Iter!=v1.end();Iter++)cout˂˂“”˂˂*Iter;输出:v1=1020304050v1=20304050v1=2050 MSDN中给出的用法是直接删除某个元素或某段元素2。remove和remove_If在实际使用中,删除指定元素的更准确方法是使用remove和move_If

1. erase

  很多时候,我在删除vector元素的时候使用的是遍历指针,符合条件时使用erase删除,

可是这样的使用办法会有个问题,在vec.erase(iter)后,需要使用erase的返回值,并且这个返回值是等价iter++,也就是iter的下一个元素,

否则的话,iter将会是个无效指针

    vector<int> vec_int = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };for (vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end();) {
        if (*iter == 6){
            iter = vec_int.erase(iter);
        }
        else{
            ++iter;
        }
    }
    for (auto& i : vec_int)
    {
        printf("i = %d
", i);
    }

  可是从MSDN中看到erase并不是这么用的

   vector <int> v1;
   vector <int>::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );
   v1.push_back( 40 );
   v1.push_back( 50 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;

output:

v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50

  MSDN中给出的用法是直接删除某一个或者一段的元素

2.remove和remove_if

  实际使用中,删除指定元素更为准确的用法应该是使用remove和remove_if。

  bool isOdd(int value)
  {
    return (value % 2) == 1;
  }

  vector<int> vec_int = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    vec_int.erase(remove_if(vec_int.begin(), vec_int.end(), isOdd), vec_int.end());

    for (auto& i : vec_int)    {
        printf("i = %d
", i);
    }
    vec_int.erase(remove(vec_int.begin(), vec_int.end(), 8));

    for (auto& i : vec_int)    {
        printf("i = %d
", i);
    }

    for (vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end();) {
        if (*iter == 6){
            iter = vec_int.erase(iter);
        }
        else{
            ++iter;
        }
    }

    for (auto& i : vec_int)    {
        printf("i = %d
", i);
    }
output:
i = 0 i = 2 i = 4 i = 6 i = 8 i = 0 i = 2 i = 4 i = 6 i = 0 i = 2 i = 4
不同容器的迭代器的功能
容器迭代器功能
vector随机访问
deque随机访问
list双向
set / multiset双向
map / multimap双向
stack不支持迭代器
queue不支持迭代器
priority_queue不支持迭代器

免责声明:文章转载自《C++ 的erase和remove remove_if删除元素》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysqlslap: Error when connecting to server: 1064 Reach limit of connections 做梦的人python数据可视化案例——平行坐标系(使用pyecharts或pandas)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

阿里巴巴笔试题选解

阿里巴巴笔试题选解                                                                --9月22日,阿里巴巴北邮站 小题:(部分题目) 1、有三个结点的,可以构成多少个种叉树? 2、一副牌52张(去掉大小王),从中抽取两张牌,一红一黑的概率是多少? 编程题: 3、设计一个最优算法来查找一n个元素...

diedaiqi

转自:https://www.cnblogs.com/maluning/p/8570717.html https://www.cnblogs.com/ShaneZhang/p/4249173.html 正文 迭代器是一种检查容器内元素并遍历元素的数据类型。C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类...

sklearn参数优化方法

学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的alpha等,在学习其模型的设计中,我们要搜索超参数空间为学习器模型找到最合理的超参数,可以通过以下方法获得学习器模型的参数列表和当前取值:estimator...

boost asio 异步实现tcp通讯

---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一、前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的。而tcp通讯是项...

kaldi 三个脚本cmd.sh path.sh run.sh

参考 kaldi的全部资料_v0.4 cmd.sh 脚本为: 可以很清楚的看到有 3 个分类分别对应 a,b,c。a 和 b 都是集群上去运行这个样子, c 就是我们需要的。我们在虚拟机上运行的。你需要修改这个脚本 # "queue.pl"uses qsub. The options to it are # options to qsub. If yo...

C 工具库8:map

本篇介绍另外一个在C++ stl中常用的容器map.我打算将map的实现容器和map接口分开,创建map的时候可以传递一个实现了interface_map_container接口的对象指针进来,如果这个参数传0,则默认使用红黑树做实际的容器.这样做的好处是用户可以根据性能需求传递自己定制的容器类.例如在游戏程序中常见的数据表.一般通过一个索引查询,并且在程...