C++STL Vector详解以及使用方法

本文详细介绍了C++STL中的Vector,强调其作为动态数组的特性,支持快速随机访问,但插入操作可能导致效率降低。讨论了容量管理和优化策略,如reserve()函数的使用。还涵盖了插入、移除、迭代器、resize()等关键操作,并提到了C++11引入的新特性。最后,特别讨论了bool类型的vector特化版本及其优缺点。
摘要由CSDN通过智能技术生成

头文件 <vector>

vector是一个动态数组,默认的内存模型是C++标准库提供的allocator

在这里插入图片描述

vector的能力

vector将元素复制到内部的动态数组中,元素之间总是存在一定的顺序,所以vector是一种有序集合.

vector支持随机访问,可以在常量时间内访问任何一个元素,vector提供随机访问迭代器,适用于任何STL算法

如果你在末尾附加元素或删除元素 vector的效率就会非常好,

但如果你在前面或者中间部分插入元素,效率就比较差,作用点之后的每一个元素都必须移动到另一位置

其主要的成员变量是三个指针:如下
在这里插入图片描述

大小和容量

在这里插入图片描述
在这里插入图片描述

这个end就是实际分配内存的末尾

一旦超过了capacity,vector要重新分配内部内存

在这里插入图片描述

这个函数只有当新的容量大于当前vector的实际能够容纳的元素量,以及小于max_size()才会进行重新分配内存

在这里插入图片描述

vector的容量非常重要,有两个原因:

1.一旦内存重新分配,vector相关的所有引用指针迭代器都会失效
2.内存重新分配很耗时间

解决办法:

使用reserve()保留适当容量:

vector<int>v;
v.reserve(80);

初始化期间就向构造函数传递额外实参,构建足够的空间:
如果你的实参是个数组,它将成为vector的起始大小

std::vector<T>v(5);

想要获得这个能力,元素类型必须提供一个默认构造函数,对基础类型而言,唯一能够保证的是0初始化.

如果类型很复杂,就算提供了默认构造函数,初始化动作也是非常耗时,还不如使用reserve().

注意:从上面reserve的函数实现可以看出,vector不能使用reserve缩减容量
而且事实上为了防止内存破碎,在许多实现方案中即使你不调用reserve()第一次安插元素也会一口气分配整块内存

如果你有一大堆vector,每个vector的元素寥寥无几,浪费的内存相当可观

C++11引入了一个新的函数shrink_to_fit
在这里插入图片描述
在这里插入图片描述
可以看到如果有没有使用的容量,

如果当前容器是空的,则直接清除,如果不是为空的 缩减重新分配内存到当前的容量.

在C++11之前,还有一种办法,使用swap:
template<typename T>
void shrinkCapacity(vector<T
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值