list、vector迭代器失效问题
什么是迭代器
与数组相比,迭代器是一种面向对象的广义指针,用于指向容器中或流中的对象。可以看做是一种指向数据的指针。
什么是迭代器失效
- 迭代器的本质就是指针,迭代器失效就是指针失效。
- 指针失效:指针指向的空间是非法的。
- 指针指向非法空间:指向了被释放的空间 或者 越界访问 。
可能导致迭代器失效的操作
因为不同的容器,迭代器不尽相同。
可以引起vector迭代器失效的相同操作不一定会导致list的迭代器失效
| list | vector |
|---|---|
| / | 扩容操作 |
| 删除操作 | 删除操作 |
如何解决迭代器失效问题
list
int main()
{
selt<int> values {1,2,3,4,5,6};
for (auto it=values.begin();it! =values.end();)
{
if (3==*it)
{
values.erase(it++);
}
else
{
++it;
}
}
for (auto var :values)
{
cout<< var <<endl;
}
return 0;
}
vector
int main()
{
vector<int> values {1,2,3,4,5,6};
for (auto iter=val.begin();it! =val.end();)
{
if (3==*iter)
{
iter=val.erase(iter);
}
else
{
++iter;
}
}
for (auto var :val)
{
cout<< var <<endl;
}
return 0;
}
文章探讨了在C++编程中,特别是在使用list和vector容器时迭代器失效的问题。迭代器可视为指向容器内对象的指针,当执行特定操作如删除、扩容等时,可能会导致迭代器失效。针对list,如果在for循环中删除元素,应使用erase后返回的迭代器;对于vector,删除元素后需更新迭代器。文章提供了示例代码展示了如何在list和vector中避免迭代器失效的问题。
1454

被折叠的 条评论
为什么被折叠?



