zoukankan      html  css  js  c++  java
  • remove、erase

    remove:

    remove不是真正的删除,删除后数量并没有变化。
    它接收一对迭代器,而不是一个容器,所以不知道它作用于哪个容器。
    而且没有办法从一个迭代器获取对应于它的容器

    实现

    • remove会用需要保留的数据覆盖掉前面需要删除的数据。然后返回一个需要被删除开始位置的迭代器。
      所以通常需要结合erase使用:
    v.erase(remove(v.begin(),v.end(),1999),v.end());
    

    如果你想删除带表达式的,那么就需要 erase和remove_if的配合


    删除导致迭代器失效

    以list为例,当执行container.erase(it)时,确实第一个满足条件的元素删除了,但这时it指针已经被删除了,
    它也不指向任何元素了,所以也只能到此为止了

    list<int>::iterator it; 
      for (it = lt.begin(); it != lt.end(); ) {
        if (*it % 2 == 0)
          lt.erase(it++); //这里是关键
        else
          ++it;
      }
    

    erase:

    它删除的只是数据,并没有减小容器的容量。


    为了避免内存的浪费,你会需要一种方法来删除不必要的容量

    vector<node> (test).swap(test);
    

    在上述表达式中,vector (test)会通过拷贝构造生成一个临时变量。而且只会为拷贝的元素分配所需要的内存。
    在交换完成之后,临时变量会被析构释放。


    清除容器

    1.我们也可以上面的方法清除容器

    vector<int>().swap(v);
    

    效果等同于:清除掉元素并释放内存。。

    2.通过clear

    v.clear();
    

    只是清除掉元素。

  • 相关阅读:
    Sharp Develop发布了1.0.3版本
    【历代Windows操作系统大观】(转)
    Matlab与vc混合编程中的问题,使用idl文件
    明天回湖北!今天要开始收拾烂摊子了
    MongoDB深究之ObjectId
    MVC设计模式
    ASP.NET验证控件详解
    C# 中的 LINQ 入门学习摘记
    15款在线科学计算器
    从底层了解ASP.NET架构
  • 原文地址:https://www.cnblogs.com/Przz/p/6591010.html
Copyright © 2011-2022 走看看