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

32、如何解决vector中删除元素导致的迭代器失效问题?

使用 标准库提供的算法,如 std::removestd::remove_if 结合 vector::erase 方法来删除元素。这些算法在设计时已经考虑了迭代器失效的问题:

  1. std::remove 结合 vector::erase 方法
//remove(beg,end,const T& value) ,移除区间[beg,end)中每一个“与value相等”的元素,所以需要传入一个值
//remove()并不会实际移除序列[start, end)中的元素,
//只是将符合条件的元素移动到容器末尾 并 返回(指向第一个要移除的元素的位置的)迭代器,
//因此可以同时配合erase对vector容器中的元素进行清除
#include <iostream>
#include <vector>
#include <algorithm>		// [注意] :remove位于algorithm函数库中
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};

    std::cout << vecInt.size() << std::endl;     // 输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量

    vecInt.erase(std::remove(vecInt.begin(), vecInt.end(), 3), vecInt.end());
    
    std::cout << vecInt.size() << std::endl;     // 输出的结果为4,容器中存了4个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量

    for(auto i : vecInt)
    {
        std::cout << i << std::endl;
    }
}
// 使用remove之前,容器vector的值为: 0,1,2,3,4
// 使用remove函数删除值为3的元素后,容器vector的值为:0,1,2,4,4
// 再配合erase后,容器vector的值为:0,1,2,4
// 可以看出remove,容器的size变成了size-1,删除了值为3的元素。容器的capacity不变
  1. std::remove_if 结合 vector::erase 方法
//remove_if(beg, end, op) ,移除区间[beg,end)中每一个“令判断式:op(elem)获得true”的元素,所以需要传入一个函数指针
//remove_if()并不会实际移除序列[start, end)中的元素,
//只是将符合条件的元素移动到容器末尾 并 返回(指向第一个要移除的元素的位置的)迭代器,
//因此可以同时配合erase对vector容器中的元素进行清除
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
bool isSpace(char x) { return x == ' '; }
 
int main()
{
	string s2("Text with    spaces");
	cout << "删除之前"<<s2 << endl;
	s2.erase(remove_if(s2.begin(), s2.end(), isSpace), s2.end());
	cout <<"删除之后"<< s2 << endl;
	return 0;
}
/*
程序输出为:
删除之前Text with  spaces
删除之后Textwithspaces 
*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
	vector<string> str = { "apple", "banana", "key", "cat", "dog", "orange", "banana" };
	auto find_str = "banana";
	auto sd = remove_if(str.begin(), str.end(), [find_str](string n) { return n == find_str; });
	str.erase(sd, str.end());
 
	str.erase(remove_if(str.begin(), str.end(),
		[find_str](string n) { return n == find_str; }),
		str.end());
	vector<string>::iterator iter;
	for (iter = str.begin(); iter != str.end(); ++iter)
	{
		cout << "删除之后:"<<*iter<<" ";
	}
	return 0;
}
//apple key cat dog orange

相关文章:

  • 【编译原理】一二章
  • 手机换IP有什么用?最新换IP方法
  • 【秣厉科技】LabVIEW工具包——OpenCV 教程(11):人脸检测与识别
  • Android第五次面试总结(网络补充)
  • Thinkphp指纹识别
  • Kubernets命名空间
  • QT6通过DeepSeek API上传附件实现
  • 【文件操作】IO流
  • MPLS基础---通俗易懂
  • 通过启用Ranger插件的Hive审计日志同步到Doris做分析
  • Android studio无法查看源码
  • 小酌SM2的背景、数字签名
  • 慕慕手记项目日记 首页数据的渲染,使用js 2025-3-16
  • 【Linux内核系列】:动静态库详解
  • 企业数据治理解决方案(46页PPT)(文末有下载方式)
  • CMAC算法原理
  • springboot 打包 failed with MalformedInputException: Input length = 1
  • SaaS系统的销售微服务与权限微服务边界设计
  • 湖仓一体:数据湖与数据仓库的融合模式解析
  • 算法系列——有监督学习——3.逻辑回归
  • 上博东馆常设陈列入选全国博物馆“十大精品”
  • 网文书单|推荐4本网文,可以当作《绍宋》代餐
  • 复旦建校120周年大型义诊举行,百余名专家服务市民超三千人次
  • 国宝文物子弹库帛书二、三卷从美启程,18日凌晨抵京
  • 一条铺过11年时光的科学红毯,丈量上海科创的“长宽高”
  • 上海:到2027年,实现近海航线及重点海域5G网络高质量覆盖