C++ 头文件系列(vector)

简介

vector头文件包含vector的类模版以及该模版的示特化版本vector<
bool >

vector是C++容器库中非常通用的一模一样种植容器,如果您莫晓该控制采取啊一样栽容器,或者没足够的理使用任何容器,那么尽管因此她,没错的!

自从整体上来拘禁,vector就比如是同一栽动态数组,它拥有数组的具备机能并且能动态增长。
它根本发生以下性质:

  • 序列性容器
  • 动态增长
  • 唯独定制的内存分配政策

内存分配器

假使在有些破例的动场景被,默认的内存分配政策拉低了运行效率,这时候自定义之内存分配其不畏会见站下帮助您了~

外存分配器主要用当STL
Containers中,为容器合理之分配内存,默认使用在memory头文件被的allocator。
我们呢堪于定义内存分配器,但需满足一些求:

Other allocators may be defined. Any class Alloc for which
allocator_traits

地方就段摘录的字表明,其余能够实例化allocator_traits模版并且包含合适成员函数的类Alloc都能够当容器的内存分配器使用
再来看allocator_traits:

The non-specialized version provides an interface that allows to use
as allocator just any class that provides at least a public member
type value_type and public member functions allocate and deallocate
(see example).

就段话说,另至少提供了一个明白成员类型value_type和当面成员函数allocate和deallocate的好像都可以为允许作为内存分配器

总的来说,自定义一个舅存分配器,你起码需要

  1. 定义value_type类型
  2. 定义allocate成员函数
  3. 概念deallocate成员函数

奇函数

由vector是动态数组,它的多数规划是同array类模版类似之,这里就是不再赘言了。
我们来探望那些休一致的底地方。

resize VS shrink_to_fit

随即有限只函数是较特别之,从字面上看她还是反大小也固定值。
但实际上两者是产生分别之,我们来拘禁它的函数原型:

void resize (size_type n);
void shrink_to_fit ();

一眼便能看,两者的参数不等同:resize传入一个数值,作为新的器皿大小;而shrink_to_fit则从未参数。
那咱们不由自主要问了,既然shrink_to_fit没有点名新的容器大小,它怎么改呢?

眼看就发表了彼此语义上的例外—-一个是改大小暨为定值,另一个凡是缩小容器容量(capacity)至容器大小(size)。
也就是说,它们影响之凡容器的简单只不等地方。 同时用指出的是,
shrink_to_fit调用发出之凡请求,调用后容器容量可能于按预想缩小到容器大小了,也产生或比容器大小大;而resize调用发出的经常命,容器一定会受还调整大小及被定值。

C接口

vector提供了一个接口以供开发者直接以其中数组(vector内部以数组实现)上一直针对素进行操作:

  • value_type* data() noexcept;

顺道一提,vector与array一样,是素中的内存连续的(contiguous)。

vector< bool >显示特化

大有意思的凡vector

为什么

怎会面世如此一个例外之沙盘特化呢?
因言语支持的太小单位一般是字节(char、unsigned
char),而bool的语义意味着它们独自待1bit之内存

如果用1单字节来囤bool类型,会招特大的内存浪费,由于内存的优化考虑,就涌出了如此一个异常之物。

它们的规律非常简单,就是管每个bool用1单bit来囤,所以1独字节可以储存8个bool(在周边的机上)。
但是当时吗引出了一个烦劳的题材:每当语义上,我们应可以针对bool赋值、取地址、取引用等。
但是bool等于bit这种实现方式表示我们无克那么做

那怎么惩罚了,这里以了一个C++典型的惯用法—-代理(Proxy),它将reference成员理性定义也该代理,用这代理来以内部bit转换成bool。

Flip函数

该模版特化还蕴藏了一个额外的函数—-Flip。
顾名思义,就是拿持有bool都“翻转”,true -> false, false -> true。

先提到的reference代理也起之函数,但其是将单个bool“翻转”。 vector<
bool >类模版的flip函数可能就是是透过该函数实现的。