C++中vector模拟实现中的迭代器失效问题

 更新时间:2025年06月20日 09:10:47   作者:UP_Continue  
本文主要介绍了C++中vector插入操作导致迭代器失效的问题,插入后返回的迭代器位置变化,需及时更新以避免错误,具有一定的参考价值,感兴趣的可以了解一下

首先来看一组代码:

iterator insert(iterator pos, const T& x)
{
	// 扩容
	if (_finish == _end_of_storage)
	{
		size_t len = pos - _stare;
		reserve(capacity() == 0 ? 4 : capacity() * 2);
		pos = _stare + len;
	}
 
	iterator end = _finish - 1;
	while (end >= pos)
	{
		*(end + 1) = *end;
		--end;
	}
	*pos = x;
 
	++_finish;
 
	return pos;
}

这是关于实现insert函数的一组代码。对pos迭代器指向的位置进行插入数据。现在给出一组测试用例:

void test_vector2()
{
	std::vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	Cao::print_container(v);

	/*v.insert(v.begin() + 2, 30);
	print_vector(v);*/

	int x;
	cin >> x;
	auto p = find(v.begin(), v.end(), x);
	if (p != v.end())
	{
		p = v.insert(p, 40);
		(*(p + 1)) *= 10;
	}
	Cao::print_container(v);
}

来看运行结果:

p本来指向的是1的位置,但是现在却是40乘10,这就是因为迭代器失效的原因。当进行insert插入之后返回的迭代器已经不指向原来的位置。所以对insert插入之后的pos迭代器进行操作就会引起指向错误。所以得出,经过insert之后的迭代器就会失效。不要直接进行访问。如若访问,一定要更新失效的迭代器之后在进行访问。 

修改后的代码:

void test_vector2()
{
	std::vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	Cao::print_container(v);

	int x;
	cin >> x;
	auto p = find(v.begin(), v.end(), x);
	if (p != v.end())
	{
		p = v.insert(p, 40);
		(*(p + 1)) *= 10;
	}
	Cao::print_container(v);
}

对p这个迭代器进行修正,就得出了想要的结果。

因此在平时使用vector时,需要特别注意此类迭代器失效问题,因此的运行错误。 

到此这篇关于C++中vector模拟实现中的迭代器失效问题的文章就介绍到这了,更多相关C++ vector迭代器失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ bitset的简单使用示例

    C++ bitset的简单使用示例

    这篇文章主要介绍了C++ bitset的简单使用示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • C++中的变长参数深入理解

    C++中的变长参数深入理解

    变长参数的函数,即参数个数可变、参数类型不定的函数。设计一个参数个数可变、参数类型不定的函数是可能的,最常见的例子是printf函数、scanf函数和高级语言的Format函数。最近的一个项目中就遇到这么一个相关的问题,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)

    C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)

    这篇文章主要介绍了C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for),这些基础知识是学习C++最最基础需要掌握的知识点,需要的朋友可以参考下
    2021-05-05
  • C++实现单链表按k值重新排序的方法

    C++实现单链表按k值重新排序的方法

    这篇文章主要介绍了C++实现单链表按k值重新排序的方法,结合实例形式分析了C++单链表中按照给定值进行判断与排序的相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C语言中字符串常用函数strcat与strcpy的用法介绍

    C语言中字符串常用函数strcat与strcpy的用法介绍

    以下是对C语言中字符串常用函数strcat与strcpy的使用方法进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • Qt实现数据进行加密、解密的步骤

    Qt实现数据进行加密、解密的步骤

    本文主要介绍了Qt实现数据进行加密、解密的步骤,包含QCryptographicHash和Qt-AES两种库的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • window调用api列出当前所有进程示例

    window调用api列出当前所有进程示例

    这篇文章主要介绍了window调用api列出当前所有进程示例,需要的朋友可以参考下
    2014-04-04
  • C语言入门篇--关键字static详解

    C语言入门篇--关键字static详解

    本篇文章是C语言系列基础篇,C语言中,static是用来修饰变量和函数:1.修饰局部变量–>静态局部变量2.修饰全局变量–>静态全局变量3.修饰函数–>静态函数
    2021-08-08
  • strcpy函数实现简示例命分享

    strcpy函数实现简示例命分享

    这篇文章主要介绍了strcpy函数实现简示例命,需要的朋友可以参考下
    2014-03-03
  • c++ typeid关键字的使用

    c++ typeid关键字的使用

    这篇文章主要介绍了c++ typeid关键字的使用,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2020-11-11

最新评论