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

相关推荐
王老师青少年编程13 小时前
2025年【江苏“信息与未来”编程思维】真题及题解(T2:坐标变换)
c++·题解·真题·坐标变换·编程思维·江苏·信息与未来
2023自学中17 小时前
C++ 内存追踪器
linux·c++
DogDaoDao1 天前
【GitHub】 LLVM Project 深度解析:现代编译器基础设施的基石
java·c++·python·程序员·github·编译器·llvm
KuaCpp1 天前
C++进程(下)
c++
来一碗刘肉面1 天前
C++中的引用语法
c++·算法
杜子不疼.1 天前
【Qt初识】工程起步:项目创建、代码解读与对象树
数据库·c++·qt
知无不研1 天前
算法:Fizz Buzz解题思路
c++·算法·leetcode
汉克老师1 天前
GESP2026年6月认证C++八级( 第二部分判断题(1-10))精讲
c++·归并排序·dijkstra·二分·互斥·gesp8级·可重复组合
nianniannnn1 天前
c++复习自存--流、异常处理、多线程与C++工程规范
开发语言·c++
诚信定制8391 天前
C++23新特性实战与CLion深度支持
开发语言·c++·算法