STL vector用法

来源:互联网 发布:smart电子白板软件安装 编辑:程序博客网 时间:2024/05/16 18:45

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)

cvec元素互换。

同上操作。

 

 

 

 

c.resize(num)

重新指定队列的长度

c.reserve()

保留适当的容量

c.size()

返回容器中无数数量

 

 

 

 

原创粉丝点击