c/c++标准库(一)vector容器
vector类的构成:class vector:protected _Vector_base protected 继承:基类的public在子类中变为protected;vector是一个动态数组容器,又被称之为向量。可以理解为一个动态数据,是一个std标准库中封装好的一个类,可以容纳多种数据类型。
·
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.无参构造后连续插入:增长方式1,2,4,8,16,32,...
2.有参构造后连续插入:增长方式10,20,40,80,...
增长时具体发生什么:
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,将会获取引用的引用,从而产生矛盾。
点击阅读全文
更多推荐
目录
所有评论(0)