博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C/C++开发】STL erase()函数使用要小心
阅读量:5008 次
发布时间:2019-06-12

本文共 1481 字,大约阅读时间需要 4 分钟。

erase()函数的功能是用来删除容器中的元素

删除某个容器里的某个元素:c.erase(T);
看似一个简单的动作,然而对不同类型的容器,内部却做了截然不同的事情,后面介绍。

假设有这样一个题目,将某个容器中所有满足条件N == X的元素删除,按照常规的思路应该有类似这样的代码:

// 假设和container分别表示一种容器和对应的一个对象

Container<T>::iterator it;
for (it = container.begin(); it != container.end(); ++it) {
  
if (N == X)
    container.erase(it);
}

然而这样的代码对于任一种容器都是错误的STL中erase()小心使用

容器按内存分配方式可以分为链表容器和数组容器。

所谓的链表容器指的是一种表现方式,包括list、slist等这样基于节点的容器(动态分配内存块)和set、map、multiset、multimap等关联容器(平衡树实现),而数组容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector、deque、string等。

链表容器以list为例,当执行container.erase(it)时,确实第一个满足条件的元素删除了,但这时it指针已经被删除了,它也不指向任何元素了,所以也只能到此为止了,也就是说上面的代码对于链表容器来说只能正确删除第一个满足条件的元素,针对这个问题我们首先想到的就是在删除指针之前,给其做个备份。

将这个临时变量直接建立在erase实现里,这样做更简洁,也显得专业些。

list<int>::iterator it; 

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

 

链表容器使用erase删除节点还有一个特点,就是会将下一个元素的地址返回,所以也可以这样实现:

list<int>::iterator it; 

  for (it = lt.begin(); it != lt.end(); ) {
    if (*it % 2 == 0)
      it = lt.erase(it);//自动返回下一个元素的地址,不用再主动前移指针
    else
      ++it;
  }

 

数组容器以vector为例,当执行container.erase(it)时,和上面提到的一样,第一个满足条件的元素删除了,但这时数组容器不允许中间有“空隙”,所以会做个大动作,就是将被删元素后面所有的元素前移(参考STL源码),而数组容器记录的是下标,所以删除元素后,当前下标定位的元素也就顺理成章的变成了原有队列中的下一个元素,同样以删除偶数为例,代码如下:

vector<int>::iterator it = v.begin();

  for (it = v.begin(); it != v.end(); ) { 
    
if (*it % 2 == 0)
      v.erase(it);//删除元素后,后面元素自动往前移,不用挪动指                  
    
else
      
++it;
  }
 网上有说在VS2005里面上面的v.erase(it)写法是行的  VS2008及2010却运行会出现错误 会出现
vector erase iterator outside range  最保险的做法是
将v.erase(it)改成 it=v.erase(it)

转载于:https://www.cnblogs.com/huty/p/8517151.html

你可能感兴趣的文章
1.7 将一个MxN矩阵所有为0的元素所在行和列全部置0
查看>>
删除U盘时提示无法停止‘通用卷’设备的解决方法!!不要每次都硬拔了,对电脑有不小的损害!!!...
查看>>
Java中接口与接口和类之间的关系
查看>>
芯片TPS70925
查看>>
.net wordpress 服务器类
查看>>
MVC的一个简单实例
查看>>
python中的字符串格式化
查看>>
JVM平台上的响应式流(Reactive Streams)规范
查看>>
南阳理工57---6174问题
查看>>
Spinner实现列表下拉功能
查看>>
HTML5全栈工程师学什么?
查看>>
【Dart】生成固定长度随机数
查看>>
.NET 使用 RabbitMQ 图文简介
查看>>
php中的namespace 命名空间
查看>>
python数据写入Excel表格
查看>>
tensorflow win10 系统下安装
查看>>
Referer
查看>>
Linux 学习笔记
查看>>
wampserver php 设置时间
查看>>
elasticsearch 动态映射
查看>>