欢迎光临散文网 会员登陆 & 注册

C++STL迭代器失效总结

2023-03-05 22:06 作者:Uniblademaster  | 我要投稿

看了很多中英文的相关介绍,发现迭代器失效这一章很多讲得都不够清晰,这里重新梳理一下,希望能对大家有所帮助。

目标读者:最好了解容器底层原理,至少会调用各容器的接口
这里我选择按照容器分类:

vector

  1. reserve: 如果参数大于原容量,所有迭代器,引用,指针失效,如果小于则不会有任何影响。

  2. 插入型函数(包括但不限于insert):
    分两种情况

  • 如果引起内存重新分配,则所有迭代器,引用,指针失效

  • 如果没有引起内存重新分配,则插入位置之前的所有迭代器,引用,指针不变,之后的所有迭代器,引用,指针失效。

  1. 删除型函数(包括但不限于erase,但是不包括clear):同2

  2. clear: 所有迭代器,引用,指针失效。

list

  1. clear: 所有迭代器,引用,指针失效。

  2. 其余更易型操作: 仅操作的对象的迭代器,引用,指针失效。

forward_list

  1. clear: 所有迭代器,引用,指针失效。

  2. 其余删除型操作:仅操作的对象的迭代器,引用,指针失效。

deque

deque比较特别,因此用了斜体

  1. clear: 所有迭代器,引用,指针失效。

  2. 插入型函数(包括但不限于insert):
    分两种情况

  • 如果插入在deque的开头或结尾,所有迭代器和指针失效,而引用不受影响。

  • 如果插入在deque的中间,则所有迭代器,指针和引用都失效。

  1. 删除型函数(包括但不限于erase,但是不包括clear):
    分3种情况

  • 如果删除了末尾元素,则被删除元素的迭代器,指针和引用都失效,并且尾后(past-the-end)迭代器失效。

  • 如果删除了首元素,则仅被删除元素的迭代器,指针和应用都失效,但尾后迭代器不受影响。

  • 如果仅删除了首尾元素之外的元素,则仅被删除元素的迭代器,指针和引用失效,但尾后迭代器不受影响。

关联容器(有序)

clear及其它删除型操作都仅使被删除元素的迭代器,指针和引用失效。

无需关联容器

分三种情况

  • clear及其它删除型操作都仅使被删除元素的迭代器,指针和引用失效。

  • 插入型函数(包括但不限于insert): 首先不会改变指针和引用。只有当“优先于操作元素的元素数量+插入的操作元素的元素数量<桶的数量*装填因子”时才会使迭代器失效

  • rehash, reserve: 仅使所有迭代器失效,但不改变指针和引用。

valarray

resize: 使所有迭代器,指针和引用失效。


C++STL迭代器失效总结的评论 (共 条)

分享到微博请遵守国家法律