vector 容器
vector(向量):C++中的一种数据结构,确切的说是一个类。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,可以使用 vector 来解决问题,以达到最大节约空间的目的。
可以简单的认为,向量是一个能够存放任意类型的动态数组。
使用前提
1.使用 vector 必须使用头文件 vector
2.vector 属于 std 命名空间的,注意使用 using name std;
vector 的定义
- 基本语法
vector<type> vactor_name;
例如: vector<int> vec;
创建一个数组类型是 int 类型的动态数组 vec;
- 初始化 ① 这个语句将 vec 定义为 10 个整数的矢量,但这只是一个起始大小。但没有给出初值,其值是不确定的。
vector<int> vec(10);
② 在这个语句中,vec 被定义为 10 个整数矢量,并且 numbers 中的每个元素都被初始化值 2。
vector<int> vec(10,2);
③ 该语句定义了一个名为 numbers 的 int 矢量。该矢量有 4 个元素,其初始化值为 10,20,30 和 40。
vector<int> numbers {10, 20, 30, 40};
注意,初始化列表被括在一组大括号中,但是在它前面不使用赋值运算符(=)。
基本函数实现
添加元素
- push_back()
vec.push_back()
在尾部加入一个数据
例如:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
//在尾部加入数字10
vec.push_back(10);
//在尾部加入数字20
vec.push_back(20);
//在尾部加入数字30
vec.push_back(30);
return 0;
}
动态数组的访问
- front()
vec.front()
返回 vec 的第一个元素值
- back()
vec.back()
返回 vec 的第一个元素值 - vec[i]
返回 a 的第 i 个元素,当且仅当 a[i]存在
-示例:
动态数组的访问 示例代码
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
cout << "第一个元素是:" << vec.front() << endl;
cout << "最后一个元素是:" << vec.back() << endl;
cout << "下标为1的元素值是" << vec[1] << endl;
return 0;
}
运行结果:
第一个元素是:10
最后一个元素是:30
下标为1的元素值是20
遍历函数
- 借助迭代器进行访问
遍历 vector 示例代码
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
for (vector<int>::iterator it = vec.begin();it != vec.end();it++){
cout << *it << endl;
}
return 0;
}
运行结果:
10
20
30
:::
- 以数组的方式访问
遍历 vector 示例代码
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
return 0;
}
运行结果:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
分析
size 函数得到的是容器里的元素个数
这种遍历方式会比较推荐
删除函数
- pop_back()
vec.pop_back()
删除最后一个数据
- clear()
vec.clear()
移除容器中所有的数据
- erase()
① 删除单个元素
vec.erase(vec.begin + num)
删除下标 num 位置上的元素
删除单个元素 示例代码
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
cout << "删除前:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
vec.erase(vec.begin() + 1);
cout << "删除后:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
return 0;
}
运行结果:
删除前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
删除后:
第1个元素值是:10
第2个元素值是:30
分析
删除的是下标 1 位置上的元素 20,后面的元素自动往前补齐。
② 删除某一范围的元素
vec.erase(vec.begin + num1,vec.begin + num2)
删除下标 num1 到下标 num2-1 区间位置上的元素
删除某一范围的元素 示例代码
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
vec.push_back(40);
vec.push_back(50);
vec.push_back(60);
cout << "删除前:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
vec.erase(vec.begin() + 1,vec.begin() + 4);
cout << "删除后:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
return 0;
}
运行结果:
删除前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
第4个元素值是:40
第5个元素值是:50
第6个元素值是:60
删除后:
第1个元素值是:10
第2个元素值是:50
第3个元素值是:60
分析
删除的是下标 1 到下标 3 之间的元素 20,30,40,后面的元素自动往前补齐。
插入函数
- 在指定位置上插入元素值
vec.insert(a.begin()+num,value);
在下标 num 的位置上插入元素 value
删除某一范围的元素 示例代码
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
vec.push_back(40);
vec.push_back(50);
vec.push_back(60);
cout << "插入元素前:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
vec.insert(vec.begin() + 1,100);
cout << "插入元素后:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
return 0;
}
运行结果:
插入元素前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
第4个元素值是:40
第5个元素值是:50
第6个元素值是:60
插入元素后:
第1个元素值是:10
第2个元素值是:100
第3个元素值是:20
第4个元素值是:30
第5个元素值是:40
第6个元素值是:50
第7个元素值是:60
分析
插入在下标 1 的位置上,原来下标 1 及以后的元素自动往后补齐。
- 在指定位置 num 前插入 n 个值为 value 的元素
vec.insert(vec.begin()+num,n,value)
在下标 num 位置上插入 n 个元素,值都是 value
删除某一范围的元素 示例代码
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
vec.push_back(40);
vec.push_back(50);
vec.push_back(60);
cout << "插入元素前:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
vec.insert(vec.begin() + 1,2,100);
cout << "插入元素后:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
return 0;
}
运行结果:
插入元素前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
第4个元素值是:40
第5个元素值是:50
第6个元素值是:60
插入元素后:
第1个元素值是:10
第2个元素值是:100
第3个元素值是:100
第4个元素值是:20
第5个元素值是:30
第6个元素值是:40
第7个元素值是:50
第8个元素值是:60
分析
插入在下标 1 的位置上,连续 2 个元素 100,原来下标 1 及以后的元素自动往后补齐。
- 在指定位置 num 前插入区间[start, end)的所有元素
vec.insert(vec.begin()+num,vec+satrt,vec+end)
删除某一范围的元素 示例代码
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
vec.push_back(40);
vec.push_back(50);
vec.push_back(60);
cout << "插入元素前:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
vec.insert(vec.begin() + 1,vec.begin() + 2,vec.begin() + 5);
cout << "插入元素后:" << endl;
for (int i=0;i<vec.size();i++){
cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
}
return 0;
}
运行结果:
插入元素前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
第4个元素值是:40
第5个元素值是:50
第6个元素值是:60
插入元素后:
第1个元素值是:10
第2个元素值是:30
第3个元素值是:40
第4个元素值是:50
第5个元素值是:20
第6个元素值是:30
第7个元素值是:40
第8个元素值是:50
第9个元素值是:60
分析
vec.begin() + 2 到 vec.begin() + 5 这个区间的元素是 20,30,40,插入在在下标 1 的位置上,原来下标 1 及以后的元素自动往后补齐。
其他重要函数
- a.size();
返回 a 中元素的个数; - vec.begin();
指向迭代器中的第一个元素 - vec.end()
指向迭代器中末端元素的下一个,指向一个不存在的元素
vector 函数列表
函数 | 描述 |
---|---|
at(index) | 读取 vector 指定索引 index 的元素的值。 |
begin() | vector 的第一个元素的地址。 |
end() | vector 的最后一个元素的下一个地址。 |
front() | vector 的第一个元素的值。 |
back() | vector 的最后一个元素的值。 |
size() | vector 中元素的数量。 |
push_back(val) | 往 vector 最后插入一个元素 val。 |
insert(iterator,val) | 往 vector 指定位置插入元素 val。 |
emplace(iterator,val) | 往 vector 指定位置插入元素 val。 |
pop_back() | 删除 vector 最后一个元素。 |
erase(iterator) | 删除 vector 指定位置的元素。 |
clear() | 清空 vector。 |
empty() | 检查 vector 是否为空。 |
assign() | 从指定范围内赋值给 vector。 |