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的相关操作


STL中的vector详解_第1张图片


vector的使用:


(1)头文件

 #include


(2)常用的声明以及初始化

 int ar[]={12,23,34,45,56,67,78,89,90,100};
 int n = sizeof(ar)/sizeof(ar[0]);
 vector ivec1;//声明一个元素为int的vec。
 vector ivec2(5);//声明一个初始大小为5,元素为int的vector。
 vector ivec3(5,23);//声明一个大小初始大小为5且值为23的vectr
 vector ivec4(ar,ar+n);//将ar的n个元素拷贝到ivec4中去
 vector ivec5(ivec4);//用ivec4初始化ivec5
 vector 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::iterator it = vec.begin();
  可以利用*it+100对*it所对应的数据进行修改。
 Vector::const iterator it = vec.begin(); //it是常迭代器
  不可以利用*it+100对*it所对应的数据进行修改。

对于这些vector常见操作的使用,我这里就不贴代码了,大家自己可以联系使用一下。然后我说一下在面试时被问到的一些问题吧!

面试中被问到的问题:

1、vector的增长方式。

2、vector中是否可以跳着插入元素,比如说是现在最后一个元素的下标是9,那么我们是否能直接在下标为12的位置插入元素。

答案当然是不能。

3、vector中删除一个元素是否会释放空间。

4、什么情况下使用vector。





你可能感兴趣的:(STL)