• STL迭代器失效问题(待进一步补充,当前仅总结vector和list)


    1.为何vector的push_back/insert操作可能会导致迭代器失效?

    如果vector的push_back/insert操作导致vector需要改变它的capacity时,会在另一块较大的内存区域去分配新的空间(一般是原来空间的2倍),并把原来位置的内容拷贝过来,最后再把原来位置的存储给释放掉.位置发生了改变,会导致迭代器失效.

    不过如果插入操作不改变它的capacity时:

      对于push_back,尾后迭代器(end)会失效;

      而对于insert操作,其前面的迭代器和引用不会失效,而其后的迭代器都会失效(包括尾后迭代器).

    2.vector的erase操作:

    非法化位于擦除点或之后的迭代器,包含 end() 迭代器。

    假如擦除位置是p,则擦除后p指向了它原先对应元素的后一个元素,如果p是最后一个元素,则擦除后指向了end.

     

    3.vector的迭代器非法化

    操作非法化
    所有只读操作 决不
    swap 、 std::swap end()
    clear 、 operator= 、 assign 始终
    reserve 、 shrink_to_fit 若 vector 更改容量,则为其全部。否则为无。
    erase 被擦除元素及之后的所有元素(包括 end() )。
    push_back 、 emplace_back 若 vector 更改容量,则为其全部。否则仅 end() 。
    insertemplace 若 vector 更改容量,则为其全部。否则仅为在或于插入点后者(包括 end() )。
    resize 若 vector 更改容量,则为其全部。否则仅 end() 与被擦除元素。
    pop_back 被擦除元素及 end() 。

    4.list

    在 list 内或在数个 list 间添加、移除(remove)和移动元素不会非法化迭代器或引用。迭代器仅在对应元素被删除时非法化(erase)

    erase指向被擦除元素的迭代器和引用被非法化。其他引用和迭代器不受影响

    5.deque

  • 相关阅读:
    [Axiom 3D]1.初识Axiom
    [.Net]System.OutOfMemoryException异常
    一个恶心的需求
    度分秒的正则表达式
    CSLA.Net学习(3)INotifyPropertyChanged和IDataErrorInfo
    [转载]高斯正反算
    分带?不分带?
    chm帮助文档制作及C#调用
    OleDb未指定错误
    [学习笔记]工厂方法用于数据库开发
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/13080863.html
Copyright © 2020-2023  润新知