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模拟

相关推荐
邪修king4 分钟前
【UE4/UE5 萌新向】有C++基础如何快速入门虚幻引擎?超详细图文全揭秘!
c++·ue5·ue4
Shadow(⊙o⊙)5 分钟前
C语言学习中需要的额外函数
c语言·开发语言·学习
还是大剑师兰特6 分钟前
pinia-plugin-persistedstate详解与Vue3使用示例
开发语言·javascript·ecmascript
Imxyk7 分钟前
P9244 [蓝桥杯 2023 省 B] 子串简写
数据结构·c++·算法
艾莉丝努力练剑8 分钟前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习
方便面不加香菜8 分钟前
C++ 类和对象(二)
开发语言·c++
@大迁世界10 分钟前
20.“可复用组件”具体指的是什么?如何设计与产出这类组件?.
开发语言·前端·javascript·ecmascript
有味道的男人10 分钟前
电商效率翻倍:用 Open Claw 对接 1688 接口,快速实现图片选品 + 货源监控
java·开发语言·数据库
froginwe1111 分钟前
Chart.js 雷达图:深入解析与实际应用
开发语言