zoukankan      html  css  js  c++  java
  • stl容器中的元素删除方法

    STL中元素的删除方法:

    问题描述:

    对于容器:container<int> c;

    要删除其中元素值为1的元素。container为一类容器。

    1、  连续内存的容器(vector、deque或string)

    采用erase-remove方法

    c.erase(remove(c.begin(), c.end(), 1),c.end());

    对于list而言,这一方法也适用,但方法2更有效

    调用erase不仅会使指向被删除的元素迭代器无效,也会使被删除元素之后的迭代器无效,若要循环删除需要利用erase的返回值——指向紧随被删除元素之后的下一个有效迭代器。

    扩展:

    vector清空所有元素常用方法(deque也适用,但更常用的是clear):

    vector<int> vec;

    {

             vector<int>vecTemp;

             vecTemp.swap(vec);

    }

    注:使用clear来删除元素并不能使vector的size变为0,而对于deque来说使用clear可以使size变为0,

    2、  list

    list由于其插入和删除的时间是O(1)的,所以其删除也与其他容器不同,采用成员函数remove更为高效

    c.remove(1);

    3、  标准关联容器(set、multiset、map、multimap)

    c.erase(1);

    当删除容器中的元素时,指向该元素的所有迭代器都将变得无效。当循环删除时可以使用

    c.erase(iter++);   //先使iter指向下个元素,再删除当前元素

    p. s:不能使用remove操作(因为没有remove成员函数,而使用remove算法可能会覆盖容器的

    值)

    总结:

    再说下几点不同:vector等非关联容器的erase和关联容器的erase返回值并不一样,前者返回指向紧随被删除元素之后的下一个有效迭代器,后者返回void。list容器比较特殊,对其进行删除,排序等操作应使用其成员函数(高效而又不会出错)。

    最后推荐一下学习stl的书籍:《EffectiveSTL》Scott、《stl 源码剖析》侯捷(对stl还没入门的先找一本入门书看看)

  • 相关阅读:
    从远程库克隆
    添加远程库
    远程仓库
    删除文件
    xml 解析的四种方式
    遍历Map
    Spring 和SpringMVC 的父子容器关系
    JDK各版本新特性!
    看啦这么就别人的博客 我也来写一篇! Object转换其他类型
    手机访问电脑搭建的服务器地址
  • 原文地址:https://www.cnblogs.com/OpenLinux/p/5020701.html
Copyright © 2011-2022 走看看