STL库vector模拟实现

vector的核心成员

T* _start, T* _finish,T* _end_of_storage,分别是指向第一个有效元素,最后一个有效元素的下一个位置,可容纳元素中最后一个元素的下一个位置。当_start== _finish时,有效元素个数为0

vector的扩容策略

单增一个有效元素导致的扩容就采用倍增的方法,如:reserve(capacity()==0 ? 4: 2*capacity()),扩容后肯定符合要求,而对于一次添加很多的元素导致的扩容,因为扩二倍也不一定够,所以按要添加的元素个数来扩容

vector的常用方法

构造函数:

默认构造函数,三个指针全为nullptr

vector会设置n个有效元素,第二个参数是n个有效元素的赋值对象,其缺省值是匿名对象,所以如果元素是内置类型,那么该缺省值还会起到一个初始化内置类型的作用

利用vector的迭代器vector::iterator初始化vector

拷贝构造

size

返回有效元素个数

capacity

返回元素容量个数

resize

设置vector的元素个数为n,如果n小于当前有效元素个数,那就截断,如果n大于当前有效元素个数,那就新增有效元素用val来赋值,之前的有效元素不受影响

reserve

如果n小于等于当前vector的元素容量个数,那就什么都不做,如果n大于当前vector的元素容量个数,那就vector扩容致n个元素的容量

operator

返回下标为n的元素的引用

push_back

增加一个有效元素,用val来进行赋值

pop_back

删除末尾的有效元素,元素容量不变

insert

在一个位置插入元素,该过程伴随着因移位所带来的大量元素赋值,元素赋值就要深拷贝,最后返回插入的元素的迭代器

在指定位置插入n个有效元素,每个有效元素会被赋值val,进行深拷贝,同时移位也会导致很多的元素赋值,这些都是深拷贝,消耗很大

erase

删除一段迭代器区间,该区间左闭右开,返回值是最后一个删除元素的下一个位置的迭代器,可能指向一个有效元素,也可能指向end(),该函数同样是因为移位而导致大量的元素赋值,元素赋值是深拷贝,会有很多资源的创建和释放,消耗也很大

swap

vector的交换只需要交换各自成员变量即可

clear

元素容量个数不变,有效元素个数清零

emplace_back

emplace_back使用了c++11的万能引用,且是可变参数模板,可以根据传入的参数选用最合适的构造函数

vector模拟实现

vector模拟

相关推荐
2401_8414956426 分钟前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr39 分钟前
2607C++,soui与安卓
c++·soui
码智社1 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海1 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖2 小时前
JDK 26 新特性详解
java·开发语言
马优晨2 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
fqbqrr4 小时前
2607C++,使用微软detours勾挂工具
c++
人邮异步社区4 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大5 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai5 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang