C++STL-vector类的使用

1.vector的介绍

1.vector是表示可变大小数组的序列容器。
2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
3.vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
4.vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
5.与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

2. vector的使用

在这里插入图片描述
我们先来看一下这个模板的参数都是什么意思。
T的意思是:元素的类型。
Alloc的意思是:用于获取/释放内存及构造/析构内存中元素的分配器。类型必须满足分配器 (Allocator) 的要求,默认情况下,使用分配器类模板。这个意思是:如果我们自己觉得默认情况的分配器不行,我们想它的效率更高,比如从内存池中获取。我们可以自己写,如果满足,我们可以去用。

2.1 vector的构造函数和拷贝构造

无参构造:
在这里插入图片描述
在这里插入图片描述
从这里,我们可以看出vector能创建许多不同类型的对象。它甚至能创建一个对象,里面是数据元素的类型是string类型的。
在这里插入图片描述
那么,现在有一个问题:第三个vector对象的push_back应该插入的是string类的对象,为什么这里可以直接插入这个字符串呢?
在这里插入图片描述
原因是:单个参数的构造函数,具有隐式类型转换
它是将这个字符串先临时构造了一个string类型的对象,然后再拷贝构造到数组里,在某些编译器下会直接构造string类的对象。

构造并初始化n个val:
在这里插入图片描述
在这里插入图片描述
我们可以看见它初始化了10个5。
使用迭代器进行初始化构造:
在这里插入图片描述
在这里插入图片描述
这里使用的是迭代器来控制范围初始化。张三是最开始的数据,小二是最后一个数据,++v3.begin()迭代器就会指向李四,–v3.end()迭代器就会指向李四。所以,v5这个对象里只有李四这一个数据。

还有这里的InputIterator是模板参数。所以,不仅仅是vector类型的迭代器可以这样初始化,其它迭代器类型也可以这样初始化。
在这里插入图片描述

拷贝构造:
在这里插入图片描述
在这里插入图片描述

2.2 vector的扩容

在这里插入图片描述
这行代码是什么意思呢?首先,我们创建一个int类型的vector对象,然后记录它的初始容量。然后再不断的插入,当容量再次扩容时,就和原来的容量不一样了,然后我们再把新的容量打印出来观察。
在这里插入图片描述
从测试结果看,vs下capacity是按1.5倍增长的。如果单次增加的容量大,那插入的效率会高,但空间浪费的多。如果单次增加的容量小,那插入的效率会低,但空间浪费的少。

而在vector也有reserve和resize。reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。而resize在开空间的同时还会进行初始化,影响size。但是reserve和resize在vs编译器下都不能缩容
在这里插入图片描述
但在vector中有这样的一个函数:shrink_to_fit。它可以进行缩容。

2.2.1 shrink_to_fit函数

在这里插入图片描述
在这里插入图片描述
我们看到vector的容量发生了变化。这容量的变化不是简单的释放部分内存。因为我们把内存归还给操作系统,只能把完整的内存一下全部归还,不能先归还一部分。
在这里插入图片描述
不是说,像上面这样的直接释放,而是操作系统新开辟一段空间,然后把数据拷贝过来,再把原来的空间释放。
在这里插入图片描述
它是这样一个以时间来换空间的原理,所有我们要慎用。

2.3 insert和erase函数

在这里插入图片描述
这里的insert和string那里就不一样了。string那里还可以使用下标,这里只能用迭代器。
演示如下:
在这里插入图片描述
如果我们想在第3个位置上插入数据,我们可以这样写:
在这里插入图片描述
那么,earse函数也是一样的使用道理。
在这里插入图片描述

2.4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值