Vector向量容器属于第一类容器,支持随机访问迭代器,与数组不同的是,向量容器在内存用尽时,会自动分配更大的连续内存区,将原来的元素复制到性的内存区中,并释放旧的内存区。Vector实际上相当于一个动态的数组,随机访问的时间为常数,在尾部添加速度很快,但是在中间插入元素时速度会变慢,这一点跟对数组的操作是一样的,中间插值会设计到数据的移动。
(一)在定义Vecotr时,需要给定一个具体的实参类型,例如:
vector<int> v; //定义一个int类型向量容器对象v,不指定元素个数
vector<float> v(10); //定义一个float类型向量容器对象v,指定元素个数为10
vector<float> v(10,8.6); //定义一个float类型向量容器对象v,指定元素个数为10,每个的初值为8.6。
(二)在尾部添加添加元素:
vector<int> v;
v.push_back(2);
v.push_back(3);
v.push_back(1);
对于在尾部插入元素,vector中元素地存储顺序与插入顺序保持一致,此时v中的元素顺序为:2 3 1。
若事先定义了vector的大小,使用中插如元素的个数超过了原有的大小,vector会自动扩展存储空间的长度。
vector<int> v(3);
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4); //向量容器会自动扩展长度
原来定义的vector大小为3,当插入4时,容器自动扩展长度,此时v中数据位1 2 3 4。
(三)Vector中元素的访问方式
(1)下标方式,随机访问,使用下标运算符[ ],下标从0到n-1;
vector<int> v(3);
v[0]=1; v[1]=2;v[2]=3
(2)使用迭代器访问:
首先定义迭代器对象it即vector<int>::iterator it
然后使用迭代器进行容器遍历(顺序访问)
for(it=v.begin();it!=v.end();it++)
*it;
(四)Vector中删除元素
(1)部分删除:
erase(位置) 删除单个元素
erase(位置1,位置2) 删除区域内的多个元素,位置用迭代器表示,不是下标
(2)全部删除:clear()
(五)Vector中元素的个数
(1)size():返回一个int,及元素的个数
(2)empty():返回一个逻辑值,真或假(1或0),为空返回真。
(六)若使用STL中的算法对Vector中的元素进行排序时,需选添加<algorithm>头文件
(1)反向排列算法
reverse(位置1,位置2):将vector中的元素逆序存储
eg: vector<int> v; reverse(v.begin(),v.end());
(2)排序算法
sort(位置1,位置2);
sort(位置1,位置2,比较函数);
注:sort函数默认是按从小到大的顺序排列元素,按照第二种形式自定义比较函数,按降序排列或者按照多个关键字的顺序排列。sort 实际上是快速排序,时间复杂度O(n*log(n));平均性能最优。但是最坏的情况下,性能可能非常差。如果要保证“最坏情况下”的性能,那么可以使用stable_sort,stable_sort实际上是归并排序(将两个已经排序的序列合并成一个序列),特点是能保持相等元素之间的先后次序在有足够存储空间的情况下,复杂度为n * log(n),否则复杂度为n * log(n) * log(n)。stable_sort用法和 sort相同,排序算法要求随机存取迭代器的支持,所以list不能使用排序算法,要使用list::sort。
(六)选用vector
(1)在需要使用数组的情况下,可以考虑使用vector;
(2)需要丰富的操作;
(3)无需考虑容器大小,容器自动扩张。