向量 vector
它是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。
在使用它时, 需要包含头文件 vector, #include<vector>
vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作。
vector的声明和定义
- 声明一个int向量以替代一维的数组:vector a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。
- 用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector < int > a.同理想用向量代替三维数组也是一样,vector < t*>a;再往上面依此类推.
- vector < data> c;
data为自定义的数据类型,vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。
vector的初始化
vector< int> a ; //声明一个int型向量a
vector< int> a(10) ; //声明一个初始大小为10的向量
vector< int> a(10, 1) ; //声明一个初始大小为10且初始值都为1的向量
vector< int> b(a) ; //声明并用向量a初始化向量b
vector< int> b(a.begin(), a.begin()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值
除此之外, 还可以直接使用数组来初始化向量:
int n[] = {1, 2, 3, 4, 5} ;
vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
vector 插入元素
- 插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
- 尾部插入数字:vec.push_back(a);
vector删除元素
- vec.erase(vec.begin()+2);删除第3个元素
- vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
vector访问元素
- 使用下标访问元素,cout<< vec[0]<< endl;记住下标是从0开始的。
使用迭代器访问元素.
vector< int>::iterator it; for(it=vec.begin();it!=vec.end();it++)
cout<<*it<< endl;
vector常用函数
vector<int> c.
c.clear() 移除容器中所有数据。
c.empty() 判断容器是否为空。
c.erase(pos) 删除pos位置的数据
c.erase(beg,end) 删除[beg,end)区间的数据
c.front() 传回第一个数据。
c.insert(pos,elem) 在pos位置插入一个elem拷贝
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.resize(num) 重新设置该容器的大小
c.size() 回容器中实际数据的个数。
c.begin() 返回指向容器第一个元素的迭代器
c.end() 返回指向容器最后一个元素的迭代器
vector常用算法
(1) 使用reverse将元素翻转:需要头文件#include
reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,
一般后一个都不包含.)
(2)使用sort排序:需要头文件#include,
sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).
可以通过重写排序比较函数按照降序比较,如下:
定义排序比较函数:
bool Comp(const int &a,const int &b)
{
return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。