vector 是C++的STL(标准模板库)最常用的容器之一,与array相似,都是C/C++中普通数组的升级版。与array(数组容量固定)不同的是,vector是动态分配内存的,即:数组的容量不是固定的,可以动态的对数组中的数据进行增删,同时动态的进行内存分配和释放。
#include // 头文件
using namespace std; // 所在称空间
vector 根据不同应用场景有如下几种创建方式
vector<double> values; // 创建空double类型的空容器
vector<int> Arrs {1,2,3,4,5,6,7,8,9}; // 创建整型的容器并初始化,注意这里初始化应该要用大括号({})而不是中括号([])
vector<int>::const_iterator fist1 = Arrs.begin() + 2; // 第三个迭代器
vector<int>::const_iterator last1 = Arrs.end() - 1; // 倒数第二个迭代器
vector<int> Arrs2(first1, last1); // 创建整型的容器,并初始化为Arrs的第三个到第八个:{3,4,5,6,7,8}
vector<float> Arrs3(5,6.0); // 创建浮点型容器,并初始化为5个元素的值均为6.0:{6.0,6.0,6.0,6.0,6.0}
vector 容器不但拥有普通数组的基本功能:根据索引返回值、插入、删除、迭代器等等。
函数成员 | 函数功能 |
---|---|
begin() | 返回指向容器中的第一个元素的迭代器 |
end() | 返回指向容器中的最后一个元素的迭代器 |
rbegin() | 同上 |
rend() | 同上 |
cbegin() | 和begin()功能相同,只不过在此基础上,增加了const属性,不能修改元素 |
cend() | 和end()功能相同,只不过在此基础上,增加了const属性,不能修改元素 |
crbegin() | 同上 |
crend() | 同上 |
size() | 返回实际元素个数 |
resize() | 改变实际元素的个数 |
capacity() | 返回当前容量 |
empty() | 判断容器是否有元素:有返回false;没有返回true |
reverse() | 增加容器的容量 |
shrink _to_fit() | 将内存减少到等于当前元素实际使用大小 |
at() | 使用经过边界检查的索引访问元素。 |
front() | 返回第一个元素 |
back() | 返回最后一个元素 |
data() | 返回指向容器第一个元素的指针 |
push_back() | 在容器末尾添加元素 |
assign() | 用新元素替换原有内容 |
pop_back() | 删除容器尾部元素 |
insert() | 在指定位置插入一个或多个元素 |
erase() | 一处一个元素或者一段元素 |
clear() | 移除所有的元素,容器大小变为0 |
swap() | 交换两个容器的所有元素 |
emplace() | 在指定位置生成一个元素 |
常用的几个成员函数使用如下:
数组片段截取就是将vector数组的某一段连续的区间单独提取出来存储在另外一个vector数组。比如有一个有5个元素的数组Arrs,我需要将中间的三个元素单独作为数组存在另一个数组Arrs2:
vector<int> Arrs {1,2,3,4,5};
vector<int> Arrs2;
// 怎么才能将Arrs的中间三个元素,放到Arrs中去?
有一个简单粗暴的方法:穷举,找到遍历Arrs,把中间三个元素一个一个的存入。这种方法在数据量少的情况比较简单,但是数据量较大时就比较麻烦。因此这了不做阐述,下面介绍另外两种方法。
vector<int> Arrs {1,2,3,4,5,6,7,8,9}; // 假设有这么个数组,要截取中间第二个元素到第四个元素:2,3,4
vector<int>::const_iterator Fist = Arrs.begin() + 1; // 找到第二个迭代器
vector<int>::const_iterator Second = Arrs.begin() + 2; // 找到第三个迭代器
vector<int> Arrs2(First, Second); // 将值直接初始化到Arrs2
迭代器是指可在容器对象上遍访的对象
assign() 功能函数是vector容器的成员函数。原型:
1:void assign(const_iterator first,const_iterator last); //两个指针,分别指向开始和结束的地方
2:void assign(size_type n,const T& x = T()); //n指要构造的vector成员的个数, x指成员的数值,他的类型必须与vector类型一致!
vector<int> Arrs {1,2,3,4,5,6,7,8,9}; // 假设有这么个数组,要截取中间第二个元素到第四个元素:2,3,4
vector<int>::const_iterator Fist = Arrs.begin() + 1; // 找到第二个迭代器
vector<int>::const_iterator Second = Arrs.begin() + 2; // 找到第三个迭代器
vector<int> Arr2;
Arr2.assign(First,Second); //使用assign() 成员函数将Arrs对应位置的值存入Arrs2数组中
下面代码是将vector数组片段截取操作的函数打包。第一个函数的思路是给定区间左右边界相对于数组首迭代元素的位置,第二个元素是重载函数,思路是直接给定区间左右边界的迭代元素。
#include
#include
using namespace std;
//功能描述: 裁剪vector数组某一区间的元素到新的vector数组
// 参数说明:
// Arrs: 将要被裁剪的vector数组
// begin:左边界相对于Arrs.begin()的位置
// end: 右边界相对于Arrs.begin()的位置
vector<int> CutArrs(vector<int>& Arrs, int begin, int end){ // begin <= end;
//if(end > Arrs.size()) return;
vector<int> result;
result.assign(Arrs.begin() + begin, Arrs.begin() + end);
return result;
}
// 函数重载,
// 参数说明:
// begin: 某个vector数组的某一迭代元素作为区间左边界
// end: 某个vector数组的某一迭代元素作为区间有边界,且在begin之后,或本身就是begin
vector<int> CutArrs(vector<int>::const_iterator begin, vector<int>::const_iterator end){
vector<int> result(begin, end);
return result;
}
数组合并是指将多个不同的vector数组合并到一个vector数组中,如下代码所示:
vector<int> nums0 = {1,2,3};
vector<int> nums1 = {4,5,6,7};
vector<int> nums2 = {8,9};
nums0.insert(nums0.end(),nums1.begin(),nums1.end());// 将nums1数组合并到nums0数组末尾
nums2.insert(nums2.begin(),nums0.begin(),nums0.end());// 将nums0数组合并到nums2数组前面