当前位置: 首页 > news >正文

Effective STL 第9条:C++容器元素删除技巧详解

Effective STL 第9条:C++容器元素删除技巧详解

  • 删除特定值的所有对象
    • 1. 连续内存容器(vector, string, deque)
    • 2. 链表容器(list)
    • 3. 标准关联容器(set, multiset, map, multimap)
  • 删除满足特定条件的对象
    • 1. 序列容器(vector, string, deque, list)
    • 2. 标准关联容器
  • 循环内执行额外操作时的删除
    • 1. 序列容器
    • 2. 关联容器
  • 总结

在C++编程中,高效地从容器中删除元素是一项基本但至关重要的技能。本文将详细介绍针对不同类型容器的元素删除方法,帮助开发者编写更高效、更安全的代码。

删除特定值的所有对象

1. 连续内存容器(vector, string, deque)

对于连续内存容器,推荐使用erase-remove习惯用法【1†source】【5†source】:

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

这里remove操作并不会真正移除元素,而是将后面的元素覆盖要删除的元素,并返回新区间的逻辑终点。随后erase负责删除两个迭代器之间的元素。

2. 链表容器(list)

对于list容器,直接使用成员函数remove更为高效【1†source】:

c.remove(1963);

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

关联容器应使用其erase成员函数【5†source】:

c.erase(1963);  // 对数时间复杂度,比序列容器更高效

删除满足特定条件的对象

1. 序列容器(vector, string, deque, list)

使用erase-remove_if习惯用法【1†source】:

c.erase(remove_if(c.begin(), c.end(), badValue), c.end());

对于list,直接使用成员函数:

c.remove_if(badValue);

2. 标准关联容器

有两种解决方案【5†source】:

方案一:使用remove_copy_ifswap

AssocContainer<int> goodValues;
remove_copy_if(c.begin(), c.end(), inserter(goodValues, goodValues.end()), badValue);
c.swap(goodValues);

方案二:使用迭代器循环删除

for(auto i = c.begin(); i != c.end(); /* 无操作 */)if(badValue(*i))c.erase(i++);  // 后缀递增确保安全else++i;

循环内执行额外操作时的删除

1. 序列容器

利用erase的返回值更新迭代器【1†source】:

for(auto i = c.begin(); i != c.end(); )if(badValue(*i)) {logFile << "Erasing " << *i << '\n';i = c.erase(i);  // erase返回下一个有效迭代器} else {++i;}

2. 关联容器

使用后缀递增确保迭代器有效性【5†source】:

for(auto i = c.begin(); i != c.end(); /* 无操作 */)if(badValue(*i)) {logFile << "Erasing " << *i << '\n';c.erase(i++);  // 先递增再删除} else {++i;}

总结

选择正确的删除方法需要考虑容器类型和删除条件【1†source】【5†source】:

  1. 特定值删除

    • 序列容器:erase-remove
    • list:remove
    • 关联容器:erase
  2. 条件删除

    • 序列容器:erase-remove_if
    • list:remove_if
    • 关联容器:循环删除或remove_copy_if+swap
  3. 循环内额外操作

    • 序列容器:利用erase返回值
    • 关联容器:后缀递增迭代器

掌握这些技巧可以显著提高C++程序的效率和安全性,是每个C++开发者必备的技能【1†source】【5†source】。

http://www.dtcms.com/a/607022.html

相关文章:

  • wordpress关闭评论窗口seo标题优化关键词怎么选
  • 推广网站做网站图结构
  • 4G LTE多天线技术
  • Python社区文化:如何参与开源并提交你的第一个PR?
  • 北京市网站建设公司排名潍坊百度关键词优化
  • 网站建设用语言wordpress pageadmin
  • Entity API vs Primitive API 详细对比
  • 织梦cms 网站计数广东个人网站备案
  • 做公司年报网站登录密码是什么创立外包网站
  • 线程本地(ThreadLocal)的缓存容器
  • 可以做项目的网站网站开发工作 岗位怎么称呼
  • 【OpenCV + VS】调用摄像头与视频文件处理
  • 云手机的网络架构
  • 品牌网站建设四川微信开发公众号
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(18):文法和单词-第四课
  • wordpress是mvc架构吗google seo网站 被k
  • 【数据分享】2000-2022年我国省市县三级的逐年牛、山羊、绵羊和马的牲畜数量数据(Shp/Excel格式)
  • 利用模板建网站工信部信息备案网站
  • 阿里云建设网站步骤网络公司网站首页图片
  • 徐州做网站企业WordPress右下角提醒
  • 凡科建站做的网站收录慢吗娱乐视频直播网站建设
  • 【目标检测】热力图可视化脚本
  • 怎样用dede搭建网站网页传奇怎么删除
  • 做网站直播平台制作一个论坛网站多少钱
  • 电力设备机械结构声发射特征提取与深度学习驱动的裂纹损伤预测
  • 力扣面试150题打卡第五天
  • 做a货包好的网站专门做办公的网站
  • Common Go Mistakes(Ⅲ 控制结构)
  • vs建设网站营销的方法和技巧
  • 用vs2010做网站并连数据库2021ppt模板免费下载 素材