vector(向量):C++中的一种数据结构,确切的说是一个类。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,可以使用 vector 来解决问题,以达到最大节约空间的目的。
可以简单的认为,向量是一个能够存放任意类型的动态数组。
1.使用 vector 必须使用头文件 vector
2.vector 属于 std 命名空间的,注意使用 using name std;
vector<type> vactor_name;
例如:
vector<int> vec;
创建一个数组类型是 int 类型的动态数组 vec;
- 初始化
① 这个语句将 vec 定义为 10 个整数的矢量,但这只是一个起始大小。但没有给出初值,其值是不确定的。
② 在这个语句中,vec 被定义为 10 个整数矢量,并且 numbers 中的每个元素都被初始化值 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;
}
vec.front()
返回 vec 的第一个元素值
- back()
vec.back()
返回 vec 的第一个元素值 - veci
返回 a 的第 i 个元素,当且仅当 ai存在
-示例:
:: details 动态数组的访问 示例代码
#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
::
- 借助迭代器进行访问
:: details 遍历 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;
}
运行结果:
::
:: details 遍历 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
:: tip 分析
size 函数得到的是容器里的元素个数
这种遍历方式会比较推荐
::
vec.pop_back()
删除最后一个数据
vec.clear()
移除容器中所有的数据
① 删除单个元素
vec.erase(vec.begin + num)
删除下标 num 位置上的元素
:: details 删除单个元素 示例代码
#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
:: tip 分析
删除的是下标 1 位置上的元素 20,后面的元素自动往前补齐。
::
② 删除某一范围的元素
vec.erase(vec.begin + num1,vec.begin + num2)
删除下标 num1 到下标 num2-1 区间位置上的元素
:: details 删除某一范围的元素 示例代码
#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
:: tip 分析
删除的是下标 1 到下标 3 之间的元素 20,30,40,后面的元素自动往前补齐。
::
- 在指定位置上插入元素值
vec.insert(a.begin()+num,value);
在下标 num 的位置上插入元素 value
:: details 删除某一范围的元素 示例代码
#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
:: tip 分析
插入在下标 1 的位置上,原来下标 1 及以后的元素自动往后补齐。
::
- 在指定位置 num 前插入 n 个值为 value 的元素
vec.insert(vec.begin()+num,n,value)
在下标 num 位置上插入 n 个元素,值都是 value
:: details 删除某一范围的元素 示例代码
#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
:: tip 分析
插入在下标 1 的位置上,连续 2 个元素 100,原来下标 1 及以后的元素自动往后补齐。
::
- 在指定位置 num 前插入区间[start, end)的所有元素
vec.insert(vec.begin()+num,vec+satrt,vec+end)
:: details 删除某一范围的元素 示例代码
#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
:: tip 分析
vec.begin() + 2 到 vec.begin() + 5 这个区间的元素是 20,30,40,插入在在下标 1 的位置上,原来下标 1 及以后的元素自动往后补齐。
::
- a.size();
返回 a 中元素的个数; - vec.begin();
指向迭代器中的第一个元素 - vec.end()
指向迭代器中末端元素的下一个,指向一个不存在的元素