C++标准库学习之 STL Removing 操作
作者:访客发布时间:2023-12-24分类:程序开发学习浏览:85
导读:在研究STL的remove操作时,有很多让我非常意外的问题,使用下面例子来说一下#include<iostream>#include<list>...
在研究 STL 的remove 操作时,有很多让我非常意外的问题,使用下面例子来说一下
#include <iostream>
#include <list>
#include <algorithm>
int main(){
// 创建一个向量,带有初始内容
std::list<int> tsm_vector ={1,2,3,4,5,6,7,8,9};
// 先删除 5 这个节点,删除成功后,尾结点会向前移动
auto remove= std::remove(tsm_vector.begin(),tsm_vector.end(),5);
for (auto item:tsm_vector){
std::cout<< item<<std::endl;
}
return 0;
}
结果:
D:\CWorkSpace\tsmTest\cmake-build-debug\tsmTest.exe
1
2
3
4
6
7
8
9
9
Process finished with exit code 0
在删除后发现所有节点都向前移动了,但是最后一个节点他没管,看了一下他的源码,发现他的源码就是不停的向后遍历,
那么该如何删除掉最后这个无用的9呢,
#include <iostream>
#include <list>
#include <algorithm>
int main(){
// 创建一个向量,带有初始内容
std::list<int> tsm_vector ={1,2,3,4,5,6,7,8,9};
// 先删除 5 这个节点,删除成功后,尾结点会向前移动
auto remove= std::remove(tsm_vector.begin(),tsm_vector.end(),5);
// 在使用 erase 方法擦除无用节点
tsm_vector.erase(remove,tsm_vector.end());
for (auto item:tsm_vector){
std::cout<< item<<std::endl;
}
return 0;
}
在使用完 remove 后,这个方法会返回他删除后最新的最后一个节点,也就是新的 end ,我们只需要使用 erase[remove,eng) 这个区间就可以了
那我们能直接使用 erase 直接参数吗, 答案肯定是可以的,
#include <iostream>
#include <list>
#include <algorithm>
int main() {
// 创建一个向量,带有初始内容
std::list<int> tsm_vector = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 先删除 5 这个节点,删除成功后,尾结点会向前移动
auto remove = std::remove(tsm_vector.begin(), tsm_vector.end(), 5);
// 在使用 erase 方法擦除无用节点
tsm_vector.erase(remove, tsm_vector.end());
for (auto item:tsm_vector) {
std::cout << item << std::endl;
}
std::cout << "----------------使用 remove 后,在使用 erase-------------------" << std::endl;
std::cout << "----------------直接使用 erase-------------------" << std::endl;
std::list<int>::iterator start = tsm_vector.begin();
while (start!=tsm_vector.end()){
if (*start % 2 == 0) {
// 使用擦出后的地址继续遍历,否则原来的start 会指向野指针,导致while 循环出错,
start=tsm_vector.erase(start);
} else {
start++;
}
}
for (auto item:tsm_vector) {
std::cout << item << std::endl;
}
return 0;
}
为什么remove 无法删除数据而 erase 可以呢,在 STL 算法的设计初衷就是为了程序的扩展性等等情况考虑的, remove 等方法是与 容器脱离的,而erase 是容器自身的方法,容器自身肯定是知道容器内部的情况的,所以就形成了现在的情况
上面的例子我们使用的是 std::remove 方法,这个是 algorithm 算法库为我们提供的一个方法,想要更方便的移除该如何操作呢,
那就是调用容器的remove 方法
std::list<int> tsm_vector = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 调用 tsm_vector 这个容器的 remove 方法即可快速的移除数据
tsm_vector.remove(5);
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 8Android广播如何解决Sending non-protected broadcast问题
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版