STL中的vector详解
首先,我们对vector进行一个简单的了解:
1、vector的底层是一个动态开辟的数组。
2、vector跟数组一样也采用的连续存储空间来存储元素。这就意味着可以采用下标对vector的元素进行访问。但是vector的大小是可以动态改变的,而且它的大小会被容器自动处理。
3、vector的大小是按照二倍的方式增长的。但是准确的来说,vector不同的版本的增长方式是不一样的(在vs2012中按照1.5倍下取整的方式增长),大多数都是按照2倍的方式增长的(10-》20-》40)。
4、当有新元素插入的时候,原来数组存储满了的时候就需要重新分配空间。其做法是,分配一个大小为原来数组二倍的新数组,然后将全部元素移到这个数组。
5、vector可以很方便的查找和在尾部进行数据的插入和删除。
6、vector在删除元素时是不释放空间的。(list删除元素会释放空间)
我们根据根据下面这个图将vector中的总的可用空间和使用了的空间进行一个了解,完了之后我们再去看一下vector的相关操作
vector的使用:
(1)头文件
#include<vector>
(2)常用的声明以及初始化
int ar[]={12,23,34,45,56,67,78,89,90,100}; int n = sizeof(ar)/sizeof(ar[0]); vector<int> ivec1;//声明一个元素为int的vec。 vector<int> ivec2(5);//声明一个初始大小为5,元素为int的vector。 vector<int> ivec3(5,23);//声明一个大小初始大小为5且值为23的vectr vector<int> ivec4(ar,ar+n);//将ar的n个元素拷贝到ivec4中去 vector<int> ivec5(ivec4);//用ivec4初始化ivec5 vector<int> ivec6(&ar[2],&ar[5]);//将ar[2]到ar[5]之间的元素拷贝到ivec6中,不包括ar[5]。
(3)vector的常用操作
- vec.size(); //容器中已有元素的数量
- vec.capacity(); //容器的总容量
- vec.resize(); //对容器进行扩容。例如:vec.resize(20),没有修改_last的值,修改了_end的值。 //vec.resize(20,120),在增加20个120.修改了_last的值,也修改了_end的值。
- vec.reserve() //修改了_end的值。不修改_last的值,即不在_last之后添加数据,只是简单的扩容。
- vec.empty(); //判空
- vec.shrink_to_fit(); //减少向量大小到满足元素所占存储空间的大小:
- vec.push_back(); //末尾添加元素
- vec.pop_back(); //末尾删除元素
- vec.assign(); //将原有的数据替代为新的数据。相当于第一次初始化。
- vec.front(); //访问第一个元素
- vec.back(); //访问最后一个元素
- vec.swap(); //交换两个容器的元素
- vec.clear(); //清除容器中的元素(注意:不释放空间)
- vec.erase(); //删除元素。但是不能删除end位置的元素(因为end指针指向最后一个元素的下一个位置)
- vec.insert(); //在容器中插入元素,第一个参数是要插入元素的位置。
(4)vector中元素的访问方法:下标访问和vec.at()访问。
两者的区别就是at会检查是否越界,是则抛出out of range异常。
注意:下标以及at操作只能操作_FIRST到_LAST之间的元素,要操作在_LAST之后的数据,要调用push_back()函数。
但是这两种操作都可以对在_LAST之前的数据进行取值和操作数值(因为在这里它们重载了下标运算符)。
(5)vector常用的两个迭代器;
- vec.begin(); //开始指针
- vec.end(); //结束指针,指向最后一个元素的下一个位置
Vector<int>::iterator it = vec.begin();
可以利用*it+100对*it所对应的数据进行修改。
Vector<int>::const iterator it = vec.begin(); //it是常迭代器
不可以利用*it+100对*it所对应的数据进行修改。
对于这些vector常见操作的使用,我这里就不贴代码了,大家自己可以联系使用一下。然后我说一下在面试时被问到的一些问题吧!
面试中被问到的问题:
1、vector的增长方式。
2、vector中是否可以跳着插入元素,比如说是现在最后一个元素的下标是9,那么我们是否能直接在下标为12的位置插入元素。
答案当然是不能。
3、vector中删除一个元素是否会释放空间。
4、什么情况下使用vector。