专业编程基础技术教程

网站首页 > 基础教程 正文

解决C++ STL vector的迭代器失效的方法

ccvgpt 2025-01-04 17:40:16 基础教程 10 ℃

上一篇已经给大家分享了《C++ STL vector内存分配策略》,想了解的可以去查看。既然vector是动态分配内存,就会存在迭代器失效的可能,这是很多c++程序员容易出现BUG的地方。

导致迭代器失效的操作主要是insert、push_back(emplace_back)等操作,因为这些操作有可能导致vector重新分配内存,新分配内存后,会释放原来的内存,这时原来的迭代器会失效,如果继续访问会导致程序崩溃。比如:

解决C++ STL vector的迭代器失效的方法


那么如何解决这个问题呢?两种方法:

1.更新迭代器的值,运行正常:

2.重新定义迭代器,运行正常:

总结:

因此我们在做了一些可能影响迭代器的操作后,如果还想用原来的迭代器的话,一定要记得更新,否则会导致程序崩溃。


文本代码如下,需要测试的自取:

1.迭代器失效导致程序崩溃代码:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

std::vector<int> intVec;

auto it = intVec.begin();//这里定义了迭代器

intVec.push_back(1);

intVec.push_back(2);

//这里想打印刚刚插入的元素,但由于迭代器失效,程序会直接崩溃

for (; it != intVec.end(); ++it)

{

cout << *it << endl;

}

return 0;

}

2.迭代器失效,更新迭代器,运行正常:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

std::vector<int> intVec;

auto it = intVec.begin();//这里定义了迭代器

intVec.push_back(1);

intVec.push_back(2);

it = intVec.begin();//更新一下迭代器的值就正常了

for (; it != intVec.end(); ++it)

{

cout << *it << endl;

}

return 0;

}

3.迭代器失效,重新定义迭代器,运行正常:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

std::vector<int> intVec;

auto it = intVec.begin();//这里定义了迭代器

intVec.push_back(1);

intVec.push_back(2);

auto it1 = intVec.begin();//重新定义迭代器,运行正常

for (; it1 != intVec.end(); ++it1)

{

cout << *it1 << endl;

}

return 0;

}

Tags:

最近发表
标签列表