迭代器失效
- 一、迭代器失效的两大类型
- 异地扩容后的失效
- 原地删除后的失效
- 二、vector<string>出现的深层次拷贝问题
一、迭代器失效的两大类型
异地扩容后的失效
- 在vector容器中,通常情况下的扩容都是异地扩容,例如
resize, reserve
,但是这个行为不会改变迭代器指向的位置,因此直接异地扩容会导致迭代器的失效
原地删除后的失效
- 如果是原地删除,例如
erase
:erase的逻辑是删除某一个数的位置,让这个数往后的位置都往前挪一个位置,这种行为看起来迭代器貌似没有失效,但:
如果删除的是最后一个位置,那么:
在vs平台下,如果不接受erase
后返回的值,将会强制检查强制报错
在linux平台下,编译器不会报错,但是这种行为一是会留下安全隐患(越界问题),二是没有可移植性
二、vector出现的深层次拷贝问题
如图:我们扩容了一个vector<string>
类型的对象
但是可以看到,新的对象的string类型。指向的是原对象的string类型的值,这是属于浅拷贝的问题
- 解决方法是:
for(size_t = 0; i < size(); i++){tmp[i] = _start[i]; 这里使用自定义类型的赋值(深拷贝赋值)就算是内置类型,也可以一样赋值}