c/c++标准库(一)vector容器

vector是一个动态数组容器,又被称之为向量。可以理解为一个动态数据,是一个std标准库中封装好的一个类,可以容纳多种数据类型。
vector类的构成:class vector:protected _Vector_base protected 继承:基类的public在子类中变为protected;其他权限不变,在_Vector_base基类中包含三个成员指针:

_M_start :容器开始位置。
_M_finish:容器结束的位置,_M_finish-_M_start为当前存储数据的个数即size_M_end_of_storage:动态内存最后一个元素的下一个位置,_M_end_of_storage-_M_start 为动态数据的容量,即capacity。

vector底层实现原理

构造函数:
无参构造:使用无参构造是不分配内存,只有插入数据时才分配内存。
初始化元素个数构造,一次性申请足够的动态内存。
插入元素:

1.插入数据到最后的情况:检查空间,是否需要动态分配内存;是否需要翻倍空间。如果需要,先申请一块翻倍的内存地址,拷贝源数据到新的内存地址,再将数据插入到最后,如果不需要翻倍则直接插入到最后。
2.插入数据不插入到最后的情况:首先检查是否需要动态分配内存地址,是否需要翻倍,如果需要,先申请一块翻倍的内存地址,拷贝源数据到新的内存地址,再将待插入之后的数据向后平移一位,然后插入元素,如果不需要,则先将待插入之后的数据向后平移一位,然后插入元素。

删除元素:

1.删除最后一个元素:_M_finish往前移动一位,删除元素不会对内存进行操作,即不会对内存进行操作,也不会对已申请的内存进行缩小。
2.删除不是最后一个元素:待删除的位置之后元素向前平移一位,_M_finish往前移动一位。

读取元素:

1.使用操作符[]
2.使用at,比操作符[]多一个检查越界的动作
3.他们都是返回具体元素的引用

修改元素:

1.vector不支持直接修改某个位置的元素
2.通过读取元素,获取引用,然后修改引用的值
3.先删除后插入

释放空间:

1.使用swap一个空容器。
2.c++11 shrink_to_fit 释放掉未使用的内存。

vector内存增长机制

vector内存特点:

1.vector的内存是连续的。
2.vector的内存空间只会增加不会减少。
3.不同平台内存增长方式不一样,gcc采用的是翻倍的方式进行,VS采用0.5倍的方式进行。

vector内存增长特征:

1.无参构造后连续插入:增长方式12481632,...
2.有参构造后连续插入:增长方式10204080,...

增长时具体发生什么:

1.翻倍,申请新的内存空间。
2.拷贝原容器中的数据到新的内存地址中。
3.释放原来容器的空间
4.插入新的元素。

注意:

1.清理内存:swap空容器,c++11 shrink_to_fit(),shring_to_fit之后capacity==size;
2.移除vector当中元素为指针,不会调用析构函数,需要手动释放内存。

vector中reserve和resize的区别

vector中reserve与resize的共同点:

1.容器内原有的元素不受影响
2.起到增加的作用,对缩小操作直接无视。

vector中reserve和resize的区别:

1.reserve只能增加vector的capacity,但是它的size是不会改变的。注意不能减少,只能增加或保持。
2.resize即能增加vector的capacity,又增加了它的size;注意:不能减少。

vector中的reserve和resize的应用场景:

1.reserve用来避免多次内存分配
2.reszie确保操作符[]和at的安全性。

vector的元素类型为什么不能是引用?

引用的特征:

1.引用必须要进行初始化,不能初始化为空对象,初始化后不能改变指向。
2.引用是别名,不是对象,没有实际地址,不能定义引用的指针,也不能定义引用的引用。

vector的元素类型不能是引用的原有:

1.vector<T&>
2.不能为引用分配内存
3.push_pack(T &) 不能赋值
4.vector引用类型不能进行有参构造
5.基于操作符[]和at,将会获取引用的引用,从而产生矛盾。
点击阅读全文
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐