IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> vector迭代器失效——insert模拟实现 -> 正文阅读

[数据结构与算法]vector迭代器失效——insert模拟实现

vector支持通过输入迭代器实现插入数据,但是与此同时存在迭代器失效的问题

当我们查找某个数时,返回的位置结果是迭代器

所以这个时候我们可能需要通过迭代器插入数据

vector<int>::iterator it = find(v1.begin(),v1.end(),2);
v.insert(it,20);

?目录

一、什么是迭代器失效?

二、解决失效:insert模拟实现调整


一、什么是迭代器失效?

假设insert函数的声明如下,pos是一个迭代器,可以看作是指针

void insert(iterator& pos,const int& val);

如果现在要插入一个数,很显然需要扩容,我们的扩容方式是:

(1)? 先开辟更大的一个新空间 tmp,然后把数据拷贝到新空间

(2)? 把旧空间销毁,_start 指向新空间tmp,更新 _end、_endofstroage

?????????

此时问题出现了,旧空间被销毁,pos就成了野指针

这就是迭代器失效问题

二、解决失效:insert模拟实现调整

步骤一判断是否要扩容,若扩容,同时需要更新迭代器pos

在插入之前,直接把迭代器转换成相对位置

int pos = it - _start;

扩容完毕后,更新pos的位置,因为即便是空间地址发生改变,相对位置不会发生变化

但是此时需要注意的一点是,原本的迭代器必须要被更新

?步骤二:从最后一个位置开始,逐个向后挪,空出pos指向的位置

函数声明如下

//这里的迭代器类型参数要设置为 引用
//形参pos被更新以后,实参的it 也会被更新
void insert(iterator& pos,const int& val);

函数定义如下

void insert(iterator& pos, const T val)
{
	if (pos >= _end || pos < 0)
	{
		return;                        //越界则不执行插入
	}

	if (_end == _endofstorage)
	{
		int len = pos - _start;        //计算相对位置
		reserve(capacity() * 2);
		pos = _start + len;            //更新pos
	}

	T* finish = _end - 1;
	while (finish>=pos)            
	{
		*(finish + 1) = *finish;
		finish--;
	}
	*pos = val;                        
	_end++;
}

代码测试:

由于这里没有实现find函数,所以使用一个简单的迭代器替代

push_back的实现详见下面的博客vector模拟实现之构造函数初始化_abs(ln(1+NaN))的博客-CSDN博客vector的构造函数模拟实现,其中另外包含扩容函数reserve、尾插函数push_back的模拟实现https://blog.csdn.net/challenglistic/article/details/124021966?spm=1001.2014.3001.5501

int main()
{
	xing::vector<int> v3;
	v3.push_back(1);
	v3.push_back(2);
	v3.push_back(3);
	v3.push_back(4);

    int* pos = v3.begin() + 2;        //简易迭代器
	v3.insert(pos, 20);            
    
	return 0;
}

?插入前

?插入后

?我们发现pos的值发生变化了

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:42:57  更:2022-04-09 18:44:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:53:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码