vector 介绍
vector 是表示可以改变大小的数组的序列容器。
vector 能够容纳许多其他类型相同的元素,因此又被称为容器。 与 string 相同, vector 同属于 STL 中的一种自定义的数据类型,可以广义上认为是一个能够存放任意类型的动态数组,能够增加和压缩数据。
与数组相比,vector 消耗更多内存以换取管理存储和以有效方式动态增长的能力。
容器特性
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
声明及初始化
头文件1
vector 是一个模板类,所以需要用 vector
vector 型变量的声明以及初始化的形式也有许多, 常用的有以下几种形式:1
2
3
4
5vector<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的初始值
除此之外, 还可以直接使用数组来初始化向量。1
2
3int 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 的初值
基本函数实现
1 | void push_back(const T& x); //向量尾部增加一个元素X |
迭代
使用迭代器将容器中数据输出1
2
3
4
5
6
7vector<int>::iterator it;
auto it //上面的简写
//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
for(it=v.begin(); it!=v.end(); it++)
{
cout<<*it<<" ";
}
v.end() 指向容器器的最后一个元素的后⼀个位置。
排序1
2
3
4
5
6
7
8
9
10
11sort(vec.begin(),vec.end()); //默认从小到大
//如果想 sort 来降序,可重写 sort
sort(a,a+n,compare);
bool compare(int a,int b)
{
return a< b;
//升序排列,如果改为 return a > b,则为降序
}
reverse(obj.begin(),obj.end()); //从大到小
二维数组
- 声明了一个动态二维数组
1 | vector<vector<int>> vec; |
- 先定义好二维数组结构,再直接赋值
1 |
|
- 固定一维的大小
1 | vector<int> a[maxn]; |
上式类似声明了一个二维数组,第一维的大小是固定的(不超过maxn),但第二维的大小不固定。
注意事项
使用 vector 需要注意以下几点:
- 如果要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低。
- vector 作为函数的参数或者返回值时,需要注意它的写法:
1
2double func(vector<int>&a, vector<int>&b)
// “&”绝不可少。