跟我学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中的应用仍然是朝着简单的方向前进。所以对新的标准大家还是要认真的学习!