STL容器之 元素删除

本文深入探讨了STL容器元素删除机制与其内存分配方式之间的紧密联系,详细介绍了节点内存容器、连续内存容器及节点与连续内存混合容器的特点。针对不同内存分配方式,阐述了元素删除时迭代器的有效性和处理策略,提供了实用的代码示例。通过对比分析,揭示了STL容器在元素删除操作中如何灵活应对不同的内存布局,为开发者提供了宝贵的实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 stl容器的元素删除跟具体的按内存分配方式关系密切。按内存分配方式可以分为节点内存容器和连续内存容器、节点内存和连续内存混合容器。


节点内存容器指的是一种表现方式,包括list、slist等这样基于节点的容器(链表实现)和set、map、multiset、multimap等关联容器(平衡树实现)

连续内存容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector,string等。

节点内存和连续内存混合容器是指部分内存连续保存,连续的内存又作为节点以平衡树保存,如deque等。


1、节点内存容器

以list为例,当调用erase函数之后,被删除的元素的迭代器将会失效,则需要在删除之前移动迭代器,并传入原来迭代器的拷贝作为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;
  }

map\multimap、set\multiset只能使用方式二来删除,其erase函数不会返回下一个有效迭代器。


2、连续内存容器

以vector为例

方式一:

当调用erase函数时,迭代器指向的元素被删除了,但是被删元素后面所有的元素会被前移(具体参考STL源码), 因此迭代器会自动指向下一个元素。

vector<int>::iterator it = v.begin();
  for (it = v.begin(); it != v.end(); ) { 
    if (*it % 2 == 0)
      v.erase(it);//删除元素后,后面元素自动往前移,不用移动迭代器                  
    else
      ++it;
  }

方式二:

当调用erase函数时,迭代器指向的元素被删除了,erase函数返回下一个元素的有效迭代器。

vector<int>::iterator it; 
  for (it = lt.begin(); it != lt.end(); ) {
    if (*it % 2 == 0)
      it = lt.erase(it);//自动返回下一个元素的地址 
    else
      ++it;
  }



3、节点内存和连续内存混合容器

以deque为例,当调用erase后,原来删除的迭代器有可能失效了,erase函数返回下一个元素的迭代器。

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

需要注意的是deque删除迭代器不能使用后置++函数的方式来获取下一个有效迭代器,因为它的内存分配是节点内存和连续内存混合的。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值