📅  最后修改于: 2020-09-06 05:21:20             🧑  作者: Mango
当迭代器指向的容器内部发生变化时(即将元素从一个位置移动到另一个位置,而初始迭代器仍指向旧的无效位置),迭代器将变为无效。
向量中的迭代器失效发生在两种情况:
假设迭代器“ it”指向向量中的位置x。现在,假设该矢量发生了某种删除,由于该删除导致其元素从一个位置移动到另一个位置。现在,如果初始迭代器“ it”仍然指向旧的位置则变得无效
#include
#include
#include
#include
int main()
{
std::vector vecArr;
for(int i = 1; i <= 10; i++)
vecArr.push_back(i);
for(auto it = vecArr.begin(); it != vecArr.end(); it++)
std::cout<<(*it)<<" ";
std::cout<
解决的方法:
调用erase函数后,更新迭代器“ it”的值
// Erase and element with value 5.
auto it = std::find(vecArr.begin(), vecArr.end(), 5);
if(it != vecArr.end())
it = vecArr.erase(it);
当在向量中插入新元素时,它将在内部对其元素进行移位,因此旧的迭代器将失效。
元素移位的原因如下,
因此,当在向量中插入新元素时,其旧的迭代器可能变得无效。使用此旧的无效迭代器可能导致未定义的行为。
#include
#include
#include
#include
int main()
{
std::vector vecArr;
for(int i = 1; i <= 10; i++)
vecArr.push_back(i);
auto it = vecArr.begin();
for(; it != vecArr.end(); it++)
std::cout<<(*it)<<" ";
std::cout<
解决的方法:
调用insert函数后,更新迭代器“ it”的值
// Insert an element in position 2,
vecArr.insert ( it + 2, 1 , 200 );
// Reinitialize the invalidated iterator to the begining.
it = vecArr.begin();