Vector容器的 insert 操作可能导致迭代器失效的一些原因:

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

/*
push_back(ele);					//尾部插入元素ele
pop_back();						//删除最后一个元素
insert (const iterator pos, ele);//迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count,ele)://迭代器指向位置pos插入count个元素ele
erase (const_iterator pos);		//删除迭代器指向的元素
erase (const_iterator start, const_iterator end);//删除迭代器从start到end之问的元素
clear();//删除容器中所有元素

*/

void printVector03(vector<int>& v)
{
	if (v.empty())
	{
		cout << "容器为空" << endl;
	}
	else
	{
		for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		{
			cout << *it << " ";
		}
		cout << endl;

	}
}

void test04()
{
	vector<int> v1;
	for (size_t i = 0; i < 9; i++)
	{
		v1.push_back(i);
	}
	printVector03(v1);

	v1.pop_back();
	printVector03(v1);

	vector<int>::iterator it = v1.begin();
	v1.insert(it + 3, -1);
	printVector03(v1);

	v1.insert(it + 2, 3, -2);
	printVector03(v1);

	it = v1.begin();//更新迭代器
    //插入操后迭代器失效
	//原因
	//如果插入导致容器的大小超过了当前容器的容量,那么 vector 就需要重新分配内存 这时原来的迭代器指向的区域就会失效
	v1.erase(it + 2);
	printVector03(v1);

	v1.erase(it + 2, v1.end());//[beg,end)
	printVector03(v1);

	v1.clear();
	printVector03(v1);

}
int main()
{
	test04();
	return 0;
}

以下是chatgpt的回答

在C++中,vector 是一个动态数组容器,它会自动调整存储空间大小以适应元素的添加和删除。当你执行 vectorinsert 操作时,如果插入导致容器的大小超过了当前容器的容量,那么 vector 就需要重新分配内存,并将所有元素复制到新的内存区域,然后在新的内存区域上进行插入操作。这个重新分配内存和复制元素的过程可能导致迭代器失效,因为迭代器通常是与特定内存位置相关联的。

以下是为什么 insert 操作可能导致迭代器失效的一些原因:

  1. 内存重新分配vector 需要在插入新元素时可能会重新分配内存,这意味着现有的元素将被复制到新的内存位置。如果你持有旧的迭代器,它们将指向旧的内存位置,这些位置上的元素可能已经被移动到新的位置,因此迭代器会失效。

  2. 容量超出:如果插入操作导致 vector 的大小超过当前容器的容量,那么 vector 可能会分配更大的内存块,并将现有元素复制到新的内存中。这也会导致迭代器失效,因为它们无法自动更新以指向新的内存位置。

  3. 元素移动vector 中的元素是紧密排列的,插入元素可能需要将后面的元素向后移动以腾出空间。这些元素的移动会影响迭代器的有效性,因为它们仍然指向原来的位置。

为了避免迭代器失效,你可以考虑以下几种方法:

  1. 使用索引而不是迭代器来访问元素,因为索引不会失效。

  2. 在插入操作之前保存好迭代器,然后在插入后更新迭代器以指向正确的位置。

  3. 使用 reserve 函数来预分配足够的内存空间,以避免在插入操作时发生内存重新分配。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值