迭代器失效

185 阅读1分钟

迭代器的失效问题:对容器的操作影响了元素的存放位置,称为迭代器失效。

失效情况:

  • 当容器调用erase()方法后,当前位置到容器末尾元素的所有迭代器全部失效。
  • 当容器调用insert()方法后,当前位置到容器末尾元素的所有迭代器全部失效。
  • 如果容器扩容,在其他地方重新又开辟了一块内存。原来容器底层的内存上所保存的迭代器全都失效了。
int main() {
  vector<int> q{1, 2, 3, 4, 5, 6};
  for (auto it = q.begin(); it != q.end(); it++) {
    cout << *it << endl;
    if (*it == 2) {
      it = q.erase(it);
    }
  }
  // 1 2 4 5 6
}

vector 是连续分配内存,在 erase 之后导致后面的元素向前移动一个位置,元素的位置发生了变化,所以没有打印3。

解决方案是:利用erase方法可以返回下一个有效的 iterator。
注意:for 的()中没有 it++。

int main() {
  vector<int> q{1, 2, 3, 4, 5, 6};
  for (auto it = q.begin(); it != q.end();) {
    cout << *it << " ";
    if (*it == 2) {
      it = q.erase(it);
    } else {
      it++;
    }
  }
}