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