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

相关推荐
鬼手点金9 小时前
Scrapy + Playwright 完整示例(JS 动态渲染网页)
开发语言·javascript·爬虫·python·scrapy·html·json
Mr. zhihao9 小时前
深度解析:为什么Java序列化需要搭配ByteArrayOutputStream?IO装饰器模式的精妙设计
java·开发语言·装饰器模式
格林威9 小时前
多相机并行采图最佳实践:Task.WhenAll + 异常处理 + 资源释放
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·机器视觉
djjjx.9 小时前
【 C++ 】多态
开发语言·c++·多态
夜雪一千9 小时前
Python如何使用XPath定位没有特征的元素?无id、无class通用定位技巧
开发语言·python
艾莉丝努力练剑9 小时前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
流浪0019 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·python
光影少年9 小时前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架
鸿芯微控科技9 小时前
MFC关断后还有流量怎么办?零流量、阀门泄漏、压差与Python分析
c++·python·mfc·质量流量控制器·关断泄漏·零流量测试
SomeB1oody10 小时前
【RustyML入门】3.7. 循环层
开发语言·后端·机器学习·rust·教程