vector 介绍
我对 vector 的认识就是 C ++ 提供的包装好的数组,即 对象的集合,一般来说,刷题过程中普通数组都可以用 vector 来代替,毕竟 vector 有很对简单用法并且不用考虑长度问题。因为是基础用法部分,就不深究 vector 和数组的区别以及 vector 的特性了,直接进入使用吧
本 vector 用法说明由于只是针对 leetcode 刷题所写的常用用法,所以内容可能比较简略,只是 vector 的部分内容。
声明
虽然 leetcode 上自动包含了所有头文件,但是如果自己编程使用 vector 要加上头文件
#include <vector>
再加上 using namespace std;
或者
using std::vector;
创建,复制
vector<int> a; // 创建一个空的 vector
vector<int> a(n); // 创建一个含有 n 个对象的 vector,// 此时数据已缺省构造产生,比如现在的数组里全是 0
vector<int> a(n, elem);// 创建一个含有 n 个 elem 拷贝的 vector
vector<int> a1(a2); // 复制一个 vector
vector<int> a1(begin, end); // 这里的 begin 和 end 可以是另一个 vector 的迭代器
// 会将 [begin,end) 范围内的数据复制过来
关于最后一个用法有一个小坑可以注意一下,假设 a2 是一个含有 4 个 int 数据的 vector,
如果你是这样用的:vector<int> a1(a2.begin(), a2.begin()+3), 那么 a1 中实际有 3 个对象;
但如果你是这样用的:vector<int> a1(a2.begin(), a2.end()), 那么 a1 中实际有 4 个对象。
这是因为 a2.end()实际上指向的 并不是 vector 最后一个对象,而是最后一个对象的下一个位置。
一般来说,leetcode 刷题过程中都不用手动释放 vector 内存,所以我也就不写了
访问数据
a.begin() 返回指向首个对象的指针, 也就是一般所说的迭代器
a.end() 返回指向最后一个对象的下一个位置的指针
a.begin()+1 返回指向首个对象的下一个对象的指针
a.end()-1 返回返回指向最后一个对象的指针
a.rbegin() 返回指向最后一个对象的指针,反向迭代器
a.rend() 返回指向首个对象的前一个位置的指针,反向迭代器
迭代器我个人觉得一开始不用深究,只需要知道他们是指向 vector 对象的指针即可
反向迭代器很容易搞混。。可以不用,如果用的话要记住,rend 和 end 分别在 vector 的两头
a.front() 返回首个对象的数据,和 *a.begin()是一样的
a.back() 返回最后一个对象的数据
a.at(i) 返回编号 i 位置处的对象数据, 会检查数据是否存在
a[i] 返回编号 i 位置处的对象数据
这里建议大家尽量使用 a.at(i)来返回数据,因为会检查数据是否存在
插入
a.push_back(i); // 最简单的插入,直接向 vector 末尾加入一个数据
a.insert(pos,elem); // 向 pos 迭代器指向的对象前插入一个对象,注意是对象前
a.insert(pos, n, elem); // 向 pos 迭代器指向的对象前插入 n 个相同对象
a.insert(pos, begin, end); // 向 pos 迭代器指向的对象前插入 [begin,end) 之间的对象
后三个函数都会返回新数据的位置
删除
a.clear(); // 删除所有对象
a.pop_back(); // 删除最后一个对象
a.erase(pos); // 删除 pos 迭代器对应的对象
a.erase(begin, end); // 删除 [begin,end) 之间的对象
后两个函数会返回被删除数据的 下一个 位置
赋值
a[1] = 1; // 令编号 1 的对象数据为 1
a.assign(1, 1); // 令 a 为{1}
a.assign(begin,end); // 把另一个迭代器 [begin,end) 中的数据赋值给 a
要注意第一行和第二行结果是完全不同的,assign 函数有点类似复制函数,是对整体的操作
其它常用函数
a.size() 返回 vector 中元素的个数
a.empty() 返回 vector 是否为空,空返回 1,不为空返回 0
a1.swap(a2); // 交换 a1,a2 数据
swap(a1, a2); // 交换 a1,a2 数据,同上
swap(a1[1], a1[2]); // 交换 a1 的第 2 个数据和第 3 个数据
注意,是没有 a1[1].swap(a1[2])这种用法的
总结
本文主要介绍了 vector 的以下内容:
- 创建,复制
- 数据访问
- 插入,复制,删除
-
常用函数
- size()
- empty()
- swap()