【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
💓博主CSDN主页:杭电码农-NEO💓
⏩专栏分类:C++从入门到精通⏪
🚚代码仓库:NEO的学习日记🚚
🌹关注我🫵带你学习C++
🔝🔝
vector-下
- 1. 前言
- 2. 什么是迭代器失效?
- 3. 迭代器失效的经典案例
- 4. 迭代器失效的解决方案
- 5. 对于reserve的深度剖析
- 6. vector深浅拷贝问题
- 7. vector深浅拷贝的解决方法
- 8. 总结以及拓展
1. 前言
在阅读本篇文章前,一定要先看前集:
vector深度剖析(上)
本章重点:
本章会重点讲解vector迭代器失效问题
以及vector中的深浅拷贝问题
并且简单完善一下vector的自我实现
在此之前,我将在文章末尾把vector
自我实现的完整代码分享给大家
2. 什么是迭代器失效?
首先我们要清楚一点:
vector的每一次扩容都不是在
原地扩容,而是新开辟一块儿空间后
将原先的数据拷贝到新空间
请看下面的代码:
vector v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); auto pos = find(v.begin(),v.end(),3); v.insert(pos,30); v.insert(pos,40);
这段代码在3前面插入一个30和40
但是这段代码会出错!
为什么呢?请看下图:
注:从四个数据插入为五个会扩容
- 扩容前
迭代器pos在start和finish之间
- 扩容后
start和finish的地址改变,pos失效
pos不再指向现在的位置3
迭代器失效的本质原因是:
扩容后start和finish的地址发生变化
指向原先位置的迭代器统统失效!
若没发生扩容,则一切安好!
3. 迭代器失效的经典案例
除了前面讲到的insert导致迭代器失效外
erase函数也会导致迭代器失效
请看下面的案例:
vector v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(4); v.push_back(6); for (auto e : v) { cout if (*it % 2 == 0) { it = v.erase(it); } ++it; } for (auto e : v) { cout it = insert(it,100); it+=2; } for (auto e : v) { cout if (*it % 2 == 0) { it = v.erase(it); } else { ++it; } } for (auto e : v) { cout vv[i]=i; } assert(pos
- 扩容前
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。