vector详解

迭代器

vector维护的是一个连续线性空间。普通指针可以满足条件作为vector的迭代器。

template <typename T, typename Alloc=alloc>

class vector

{

public:

using value_type = T;

using iterator = value_type*;

};

vector::iterator //int*

vector::iterator //char*

数据存储

迭代器start和finish分别表示vector的起始元素的地址和终止元素的地址。

end_of_storage 表示vector开辟的空间的终止位置。

start - finish 表示的就是我们在连续空间中已经使用的范围。

start - end_of_storage 表示我们的总的空间大小。

finish - end_of_storage 表示我们还未使用过的空间总大小。

数据填充

无需扩容的情况:并且到finish为止,现有的元素的数量(elem_after)大于等于插入的元素数量 n

首先把绿色区域往后拷贝

把蓝色区域往后拷贝

最后在position位置拷贝进新的元素

无需扩容的情况:但是到finish为止,现有的元素的数量(elem_after)小于插入的元素数量 n

直接把n 大于elem_after之后的部分拷贝到 finish之后

把position到finish之间原有的元素全部拷贝到finish之后,为图中蓝色区域,

最后把剩余的n的一部分填充至 position到finish之间,使用 fill填充

需要扩容的情况:剩余备用的元素无法存放进全部的 n 个元素,因此需要重新分配空间,并且销毁原空间。获得容纳全部元素至少需要多少空间,重新分配空间,首地址发生改变。

首先把start到position的全部元素拷贝到新的空间

新入的n个元素翻入finish之后

最后再把原来 position到 finish之间的元素全部拷贝到 finish之后

最后调整新的 start finish end_storage

相关推荐
桀人10 分钟前
C++——内存管理——new和delete的超详细解析
开发语言·c++
Shadow(⊙o⊙)10 分钟前
Shell进程替换,自定义Shell解释器——字符串库函数灵活操作!
linux·运维·服务器·开发语言·c++·学习
_F_y19 分钟前
树形 DP 从入门到进阶:普通树形DP、树形背包、换根DP
c++·动态规划
Hua-Jay30 分钟前
OpenCV联合C++/Qt 学习笔记(二十三)----图像校正及单目位姿估计
c++·笔记·qt·opencv·学习·计算机视觉
charlie1145141911 小时前
现代C++特性指南(4)——完美转发与移动语义实战
开发语言·c++·现代c++
小白|1 小时前
cann-learning-hub:昇腾CANN社区学习中心完全指南
java·c++·算法
mirror_zAI1 小时前
C++ 仿 QQ 聊天室项目:Qt 客户端 + epoll 服务端 + Reactor 架构(含源码)
c++·qt·架构
我不是懒洋洋1 小时前
大语言模型(LLM)入门:从Transformer到ChatGPT
c语言·开发语言·c++
金创想1 小时前
积木移动题目分析及解题思路——木块问题(1)
c++·算法·字符串·c·刷题·信息学奥赛·积木
BestOrNothing_20152 小时前
C++零基础到工程实战(5.2.4):指针与引用在函数传参、返回值与效率优化中的应用
c++·指针·引用·const·函数参数