C++面试八股-STL(vector)

1.vector原理介绍

        vector是一种内存连续的可动态改变自身存储大小的可变数组,其属于C++标准模板库(standard template library,STL),使用vector需包含头文件

        vector内的元素,可类似普通数组一样使用下标直接访问,也可以通过迭代器进行访问。迭代器是一种可以访问容器内所有元素的工具,后面再详细介绍。

        vector的容量是可以动态改变的,一般情况下使用vector的步骤是:声明一个vector并指定其元素的数据类型---初始化该vector的容量大小---往该vector增删改查元素---销毁或回收vector内存。在增删改查vector元素的过程中,如果往vector中插入的元素超出了vector的容量(或者达到编译器设置的扩容阈值)时,就会触发vector的扩容操作。vector的扩容操作步骤如下:达到扩容阈值---新开辟一块大小是原vector容量的若干倍的连续内存控件---将原vector的所有数据拷贝至新开辟的内存---让vector指向新的内存---回收原先vector开辟的内存---插入新的元素。从上述步骤可以看到如果频繁触发vector的扩容操作,则会造成显著的时间损耗。

        不同系统设置的扩容系数不一样,Windows是1.5倍,Linux是2倍。

2.常用函数

resize()//改变vector容量1
reserve()//改变vector容量2
assign()//改变vector容量3,同时改变容器中的值
size()//返回返回容器中元素个数
capacity()//返回vector开辟的内存大小
begin()//返回头部迭代器
end()//返回尾部+1迭代器
rbegin()//返回逆首部迭代器
rend()//返回逆尾部-1迭代器
front()//返回首个元素
back()//返回尾部元素
push_back()//在末尾添加一个元素
emplace_back()//和push_back()是一样的作用
pop_back()//弹出最后一个元素
empty()//判断是否为空
insert()//在指定位置插入元素
erase()//在指定位置删除元素
clear()//清空容器

        ①resize()

        有下面两个重载函数

//将容器大小变为n,若n小于当前容器的容量,则n后面的元素全部删除,若n大于当前容器的容量
//则在容器末尾添加n-vec.size()个值,并且将值都设为各数据类型的默认值,例如int为0,std::string为空
void resize(size_type n);

//参数n的含义与上述相同,参数val的作用是在n大于当前容器容量时,在容器末尾添加n-vec,size()个值,
//并且将多出来的值均设置为val,当n小于当前容器容量时,多余的元素会被删除,val无效。
void resize(size_type n, const value_type& val = value_type());

        ②reserve()

        reserve本身不会触发vector对元素的任何操作,同时也不会触发vector元素的构造和析构,所以当调用了reserve,如果此时vector无元素,则size()返回值仍为0。reserve的作用主要是在vector即将添加大量元素时预先申请一块内存,尽可能减少因为频繁插入导致触发扩容操作的次数,以及避免因内存分配或回收导致产生过多的内存碎片。

//开辟一块内存,指明系统应该为这个容器预留多大的空间
//如果在reserve之前vector已经有足够的空间容纳元素了,可能reserve不生效
void reserve(size_type n);

        ③assign()

        assign()用于给vector分配元素,并支持替换当前内容,assign支持接收不同类型的参数,例如:

std::list lst = {1, 2, 3, 4, 5};  
std::vector vec;  
vec.assign(lst.begin(), lst.end());  

        需要注意,极限情况下,在使用assign()函数时,若使用其他容器的迭代器来初始化vector的元素时,如果迭代器的范围超出了vector容器规定的能申请到的最大内存长度max_len&#x

你可能感兴趣的:(c++,stl)