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

vector迭代器的使用以及迭代器失效

一、iterator的使用注意

begin与end

        遵循左闭右开的原则,begin  指向vector的第一个元素,end  指向vector的最后一个元素的往下一个位置。

 rbegin 与 rend

        rbegin指向最后一个元素的位置,rend指向第一个元素的往前一个位置。

二、vector的常用接口 

常用接口如下,不一一运行查看结果了,直接粘贴到本地运行看一下就懂了

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;

int main()
{
	vector<int>v;
	for (int i = 1; i < 10; i++)
	{
		//尾插
		v.push_back(i);
	}
	for (auto e : v)
	{
		cout << e << " ";
	}

	cout << endl;

	//获取vector的个数
	cout << v.size() << endl;

	//获取vector的容量大小
	cout << v.capacity() << endl;

	//判空
	bool emp = v.empty();
	cout << emp << endl;

	//改变vector的size
	v.resize(200);
	cout << v.size()<<endl;

	//改变vector的capacity
	v.reserve(300);
	cout << v.capacity() << endl;

	//insert,在某个位置之前插入
	vector<int>v1 = { 1,2,3,4,5 };
	v1.insert(v1.begin()+1, 100);
	for (auto e : v1)
	{
		cout << e<<" ";
	}
	cout << endl;

	//find查找,算法模块实现,不是vector的成员接口
	auto it = find(v1.begin(), v1.end(), 5);
	if (it != v1.end())
	{
		cout << "找到了" << endl;
	}

	//erase,删除指定位置元素
	auto pos = v1.begin() + 1;
	v1.erase(pos);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	//对[]的重载,使vector能像数组那样访问
	cout << v1[0] << endl;


	return 0;
}

三、迭代器失效问题

首先我们需要记住一句话:迭代器的底层是一个指针

如果指针所指向的空间被销毁的,那么该指针就是一个野指针了,那么以该指针为底层的迭代器自然就失效了

resize、reserve、insert、 assign、push_back等都有可能会造成迭代器失效的问题

以下面的代码为例:

int main()
{
	vector<int> v{1, 2, 3, 4, 5, 6};
	auto it = v.begin();

	//原本的vector空间有可能不足,那么会进行扩容
	//旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,
	//实际操作的是一块已经被释放的空间,而引起代码运行时崩溃
	
	//用100个8来填充该vector
	v.resize(100, 8);
	//v.reserve(100);将容量扩大到100,但是有效个数还是不变的
	// v.insert(v.begin(), 0);如果有效个数=最大容量,此时插入可能会造成迭代器失效
	//v.push_back(8);
	//v.assign(100, 8);//对该vector重新赋值

	//如何解决:让it重新指向vector即可,那样无论是否释放原本的空间,迭代器都指向当前的空间

	//it = v.begin();    这步是解决迭代器失效问题

	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

 

 

 

 


http://www.kler.cn/a/509523.html

相关文章:

  • 金融项目实战 06|Python实现接口自动化——日志、实名认证和开户接口
  • springboot基于微信小程序的传统美食文化宣传平台小程序
  • opencv projectPoints函数 computeCorrespondEpilines函数 undistortPoints函数
  • 如何通过高防服务隐藏服务器源IP
  • 文件操作:系统IO
  • Python操作Excel——openpyxl使用笔记(3)
  • 非科班转码第5年零241天
  • STM32 物联网智能家居 (五) 设备子系统之点亮LED灯
  • wireshark 网络分析工具
  • 1.5 GPT 模型家族全解析:从 GPT-1 到 GPT-4 的演进与创新
  • Scrapy 爬取 Bangumi 网站的分页与详情页数据
  • unity——Preject3——摄像机动画
  • Java并发05 - AQS共享模式的数据结构
  • windows 搭建flutter环境,开发windows程序
  • 新星杯-ESP32智能硬件开发--ESP32的I/O组成
  • 《重生到现代之从零开始的C++生活》—— 类和对象1
  • “深入浅出”系列之FFmpeg:(3)音视频开发的学习路线和必备知识
  • Transformer 与注意力机制原理说明与面试笔试题
  • ASP.NET Core 基础知识---依赖注入(DI)---生命周期和作用域
  • 中国数字安全产业年度报告(2024)
  • 智慧家居环境监测与控制系统的研发与应用案例分析
  • Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现
  • Linux下level-ip安装及测试_4
  • SSL配置实验
  • ChatGPT提示词合集(国内大模型可参考使用)
  • 深入了解计算机网络中的路由协议与性能优化