📜  C++ Vector元素改变时Iterator失效

📅  最后修改于: 2020-09-06 05:21:20             🧑  作者: Mango

1. 什么是迭代器无效?

当迭代器指向的容器内部发生变化时(即将元素从一个位置移动到另一个位置,而初始迭代器仍指向旧的无效位置),迭代器将变为无效。

向量中的迭代器失效发生在两种情况:

  • 在任何位置将元素插入向量
  • 从向量中删除一个元素。

2. 元素删除时Iterator失效

假设迭代器“ 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);

3. 元素插入时Iterator失效

当在向量中插入新元素时,它将在内部对其元素进行移位,因此旧的迭代器将失效。

元素移位的原因如下,

  • 如果在元素之间插入元素,则将所有正确的元素移动1。
  • 如果向量的新大小超过其当前容量,则它将重新定位更大的内存块并将所有元素复制在那里。

因此,当在向量中插入新元素时,其旧的迭代器可能变得无效。使用此旧的无效迭代器可能导致未定义的行为。

#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();