vector就相当于是一个数组,一般叫作动态数组或者向量容器,它最大的优势是可以随机访问数据.读数据,在尾部插入,删除数据的时间复杂度是常数时间O(1).但在如果不是尾部对数据删除插入是时间复杂度是线性时间O(n).
使用vector时引用头文件#include <vector> 并使用名称空间using namespace std;
vector常用函数
先假设有如下例子:
vector<int> vec;
vec.push_back(11);
vec.push_back(22);
vector<int> c;
容易混淆的size , capacity , resize, reserve
假如不用到reserve这个函数,前面三者都会比较好理解.
size就是返回当前数组有多少个元素.int totalNum = vec.size(); //返回2.
而capacity则表示数组预留的容量是多大.比如一个餐厅正在吃饭的人数是size,而餐厅所有座位总数为capacity.所以capacity >= size
不过默认情况下size与capcity是相同的.每当使用下push_back或者insert才同时添加1,比如vec.push_back(33);则size()变成3,capacity()也变成3.
但vec.erase(vec.begin());之后size()变为2,而capacity仍为3.
而resize是表示改变数组大小,在末尾添加一些元素或者删除掉之前已有的一些元素.假如数组中已经有3个数据,vec.resize(5)表示在数组末尾添加两个数据并且默认值为0,而之前3个数不变.如果是vec.resize(5, 88).则表示把增加的数赋值为88.之前的3个数仍不变. 但如果是vec.resize(2)则表示会删除之前3个数据中的最后一个.只留下2个.
使用reserve的情况就有点复杂了
reserve翻译过来是预约,表示在内存中预订多少空间给数组用.
vec.reserve( 88); //表示预约88个位置,则vec.capacity()为88.但此时vec.size()仍为2.表示实际元素个数.
另外reserve中的参数要比size()的值大才有意义,比如目前size()为10,那么vec.reserve(8)则没起任何作用,capacity()仍为10,如果是vec.reserve(11)则capacity()变为11.
还有个比较微妙的地方就是如果reserve(50),仍然接着进行其他的操作,当元素数目大于50时,capacity会自动增加一半.
例如vec.reserve(50);
vec.resize(50);
//此时capacity值为50,此是size()也为50
vec.push_back(11);
//capacity此时值为75了.比较神奇吧.是50 + 50/2; 而size()值为51
//接着操作
vec.resize(76);
//capacity此时为112,也就是75 + 75/2,但是这里要注意的是如果增幅超过75的一半了,capacity就不会这样添加一半,而是跟size()一样大了.
//例如如下上面不是vec.resize(76),而是vec.resize(113),则capacity也是113,如果是vec.resize(114),则capacity也是114.
函数名 |
解释 |
c.assign(beg,end) c.assign(n,elem) |
将[beg; end)区间中的数据赋值给c.例如c.assign(vec.begin(), vec.end()); 将n个elem的拷贝赋值给c.例如c.assgin(5,88). c有5个元素,值全为88. 注意:两个不同的assign函数如果同时使用的话,后一个会覆盖之前的值. |
c.at(index) c[index] |
传回索引index所指的数据,用at如果index越界,抛出out_of_range. 所以比如int ret =c.at(3); //越界了会抛出异常,可以用try去处理. 而int ret = at[3]; //这样越界的话就不会抛异常,是未定义行为.可能返回一个错值,也可能崩溃 |
c.back() c.front() |
back传回最后一个数据.如果数组为空可能会crash,而front是返回数组第一个元素. |
c.begin() c.end() c.rbegin() c.rend() |
begin指向开头位置的迭代器.例如vector<int>::iterator it = vec.begin(); end则是指向末尾,vector<int>::interator its = vec.end(); rbegin等同于end rend等同begin |
c.capacity() c.size() |
size是实际元素个数,capapcity是预留空间大小 |
c.clear() c.empty() |
clear移除容器中所有数据 判断容器是否为空,例如bool isEmpty = c.empty(); |
|
|
push_back(elem) c.pop_back()
|
push_back是在尾部加入一个元素 pop_back是删除尾部元素 |
c.insert(pos,elem) c.insert(pos,n,elem) c.insert(pos,beg,end) |
在pos位置插入一个elem拷贝,传回新数据位置。 在pos位置插入n个elem数据。无返回值。 在pos位置插入在[beg,end)区间的数据。无返回值 |
c.erase(pos) c.erase(beg , end) |
删除pos位置的数据,传回下一个数据的位置,例如c.erase(c.begin()); 删除[beg,end)区间的数据,传回下一个数据的位置,例如c.erase( c.begin() , c.end()) |
|
|
|
|
vector<Elem> c vector <Elem> c(vec) vector <Elem> c(n) vector <Elem> c(n, elem) vector <Elem> c(beg,end)
|
创建一个空的vector。 复制一个vector。 创建一个vector,含有n个数据,数据均已缺省构造产生。 创建一个含有n个elem拷贝的vector。 创建一个以[beg;end)区间的vector |
|
|
c.swap(vec) swap(c,vec) |
将c和vec元素互换。 同上操作。 |
|
|
|
|
c.resize(num) |
重新指定队列的长度 |
c.reserve() |
保留适当的容量 |
c.size() |
返回容器中无数数量 |
|
|
|
|