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

跟我学C++中级篇——STL中的删除对比

一、STL中的删除

在前面分析了STL查找的相关对比,本文对STL中的删除进行对比分析一下。在STL中,删除也分为两大类即std::remove与erase。虽然都是删除,但与上一篇的查找对比略有不同,其具体的用法和场景较查找要复杂一些。
std::remove与 erase同样也有相关的衍生方法如std::remove_if,ranges::remove和 std::erase_if(C++20)等。具体的细节大家可查看相关的资料文档。

二、删除的不同应用场景

std::remove适用于快速删除元素,其并未真正删除元素本身,而只是将其移动到尾部;而std::erase则用于删除容器的元素。一般在早期版本中会直接使用std::remove 和 std::erase共用,来完成相关容器元素的删除。

三、区别

std::remove和erase不同主要如以下几点:
1、所属的库不同
std::remove属于STL中的算法库而erase一般属于容器内部的函数,但在C++20提供了 std::erase等相关函数。
2、对容器处理的结果不同
std::remove并未真正删除容器中的元素,所以其size并无变化;而erase则真正删除元素,所以容器的size会相应的变小
3、适应性不同
std::remove对一些关联容器如set、map等无法使用,但可以直接调用内部的erase。
不过,随着标准的不断发展,到C++20后将二者的功能进一步整合。可以直接使用std::erase和std::erase_if来直接删除元素。

四、例程

下面看一下相关的例程:

//共同使用
std::vector<int> vec = {3, 5, 7, 9, 11, 15};//删除数据
auto delIt = std::remove(vec.begin(), vec.end(), 9);
//真正删除
vec.erase(delIt, vec.end());//C++20
#include <vector>
#include <algorithm> std::vector<int> vec = {3, 5, 7, 9, 11, 15};
std::erase(vec, 3); 
std::erase_if(vec, [](int v) { return v % 2 != 0; }); 

五、总结

在标准库中,删除的方式相对要复杂一些,但其实只要掌握了其应用的具体的情况,就能够很好的掌握其应用。不过从本文的分析也可以看出,STL中的应用仍然是朝着简单的方向前进。所以对新的标准大家还是要认真的学习!

http://www.xdnf.cn/news/379945.html

相关文章:

  • C++ learning day 02
  • 常见的算法介绍
  • 人脸真假检测:SVM 与 ResNet18 的实战对比
  • Java单例模式总结
  • 【Linux 系统调试】系统内存越界调试利器Electric Fence详解
  • waterfall与Bidding的请求机制
  • Day20打卡-奇异值SVD分解
  • Python序列化的学习笔记
  • 基于PE环境搭建及调试S32K312
  • Lua—元表(Metatable)
  • 怎样使自己处于高能量状态
  • Discriminative and domain invariant subspace alignment for visual tasks
  • JVM——即时编译器的中间表达形式
  • MYSQL 索引与数据结构笔记
  • 【大数据技术-HBase-关于Hmaster、RegionServer、Region等组件功能和读写流程总结】
  • 【Linux】线程POSIX信号量
  • JDBC工具类
  • c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能
  • 代码随想录算法训练营第三十七天
  • win10-启动django项目时报错
  • ndk.symlinkdir - 在 Android Studio 3.5 及更高版本中,创建指向 NDK 的符号链接
  • 关于数据库查询速度优化
  • vue3使用tailwindcss报错问题
  • C.循环函数基础
  • 远程调试---在电脑上devtools调试运行在手机上的应用
  • PyTorch API 3 - mps、xpu、backends、导出
  • 6.秒杀优化
  • 更换内存条会影响电脑的IP地址吗?——全面解析
  • A2A大模型协议及Java示例
  • 以影像为笔,劳润智在世界舞台上书写艺术之路