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)
将c和vec元素互换。
同上操作。
c.resize(num)
重新指定队列的长度
c.reserve()
保留适当的容量
c.size()
返回容器中无数数量
- STL vector 用法介绍
- STL vector用法介绍
- STL-Vector用法
- STL vector用法介绍
- STL vector用法介绍
- STL vector用法介绍
- STL vector用法介绍
- STL Vector的用法
- STL vector用法介绍
- STL vector用法介绍
- STL vector用法介绍
- STL vector用法介绍
- STL vector用法介绍
- STL-vector用法小结
- STL vector用法介绍
- STL vector用法介绍
- STL vector用法介绍
- STL vector基本用法
- 股票基金学习1
- 通过HTTP头部的user-agent进行浏览器兼容性检测
- TCP/IP网络层谜云之ICMP
- 整理电脑里面的前端开发中的小Tips【及时更新】
- 内核printk打印级别设置
- STL vector用法
- Ext.Net 1.x_Ext.Net_执行后台程序提示等待信息,运行完毕消失
- Android基于XMPP Smack openfire 开发的聊天室(一)
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
- exe4j制作可执行文件
- 代码获取IOS crash log
- Android SD卡的基本操作【备忘】
- 基于PostgreSQL+Postgis的空间数据库的实现(结合PHP)(2)
- 一个INFORMIX的处理日期相减得秒的函数