迭代器失效
只读方法决不会使迭代器或引用失效。此表格总结了可能使迭代器和/或引用失效的修改容器内容的方法:
类别 | 容器 | 插入后…… | 擦除后…… | 条件 | ||
---|---|---|---|---|---|---|
迭代器有效? | 引用有效? | 迭代器有效? | 引用有效? | |||
顺序容器 | array | N/A | N/A | |||
vector | 否 | N/A | 插入更改容量 | |||
是 | 是 | 在被修改元素前 | ||||
否 | 否 | 在被修改元素处或元素后 | ||||
deque | 否 | 是 | 是,除了被擦除元素 | 修改首元素或尾元素 | ||
否 | 否 | 只修改中间元素 | ||||
list | 是 | 是,除了被擦除元素 | ||||
forward_list | 是 | 是,除了被擦除元素 | ||||
关联容器 | set | 是 | 是,除了被擦除元素 | |||
无序关联容器 | unordered_set | 否 | 是 | N/A | 插入导致重哈希 | |
是 | 是,除了被擦除元素 | 无重哈希 |
此处插入指代任何添加一或多个元素到容器的方法,而擦除指代任何从容器移除一或多个元素的方法。
举个例子,最常见的vector的迭代器,下面的使用都不会导致迭代器失效
#include<iostream> #include<vector> int main() { std::vector v{ 1,2,3,4,5,6,7,8,9,10 }; v.reserve(100);//设置容量,确保不因为重新申请内存而导致迭代器失效 auto p = v.begin() + 5; std::cout << *p << std::endl; //不管是插入还是删除操作都在迭代器p的后面,所以不会导致迭代器失效 v.push_back(10); v.insert(p + 1, 10); v.erase(p + 1, p + 2); v.pop_back(); std::cout << *p << std::endl; }