目录
一、引入
前面我们已经学习了数组,应用条件是已知个数,但是据我做题的经验看来,很多是未知个数的情况。例如:现在我有n组样例,第一行输入的是样例组数n,第二行输入的是样例。
换言之,第一行输入3那么就有三组样例要输入,而第一行输入7则表示有七组样例要输入。那么这个时候再用数组难免困难,而一组样例一份代码显然不合理。那么我们就想有没有一劳永逸的方法。当然有!那就是可变长数组vector。
二、vector的简介
1.介绍
vector,常被称作“容器”,表示对象的集合。其中,所有对象类型都相同;与此同时,每个对象对应一个索引,索引与数组一样从0开始[0,n),便于查找和操作。
2.所属与信息提供
C++中有类模板和函数模板,而vector属于类模板。通常,我们需要提供另外一些信息指定编译器把类或函数实例化成什么类型。如下:
模板<信息>
具体如下:
vector<int> a; //变量a保存的是int类型的对象
vector<vector<int>> b; //变量b保存的是vector对象
3.前情注意
需要注意的一点是:在用vector前需要添加头文件
#incude<vector>
三、定义和初始vector对象
1.常用方法
引例
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n; //这里是样例个数
cin >> n; //输入样例总个数
int x; //这里是样例们
//初始化vector对象
vector<int> a; //一个含有n个元素的vector对象a
vector<int> b(n) ; //定义一个对象b
vector<int> c(n , 3) ; //定义一个对象c
vector<int> d{1 , 2 , 3 , 4} ; //定义一个对象d
//测试1.
//不改变值的前提下去输出对象值
for (auto i : a)
cout << i << " ";
cout << endl;
for (auto i : b)
cout << i << " ";
cout << endl;
for (auto i : c)
cout << i << " ";
cout << endl;
for (auto i : d)
cout << i << " ";
cout << endl;
cout << endl << endl << endl;
//测试2
//做一些操作去改变对象里面的值
while(n--)
{
cin >> x; //这里是输入样例
a.push_back(x); //涉及一个添加值的操作方法
b.push_back(x); //将值添加到b的末端
c.push_back(x); //将值添加到c的末端
d.push_back(x); //将值添加到d的末端
}
//for循环控制输出
for (auto i : a)
cout << i << " ";
cout << endl;
for (auto i : b)
cout << i << " ";
cout << endl;
for (auto i : c)
cout << i << " ";
cout << endl;
for (auto i : d)
cout << i << " ";
cout << endl;
return 0;
}
从上面我们可以看出一个定义对象操作,一个添加值操作。先不急着分析,先进行输入输出操作之后再看。
当n输入为:(注意先输出原组后再输入具体样例)
6
1 2 3 4 5 6
输出为:(此时是vector对象的原值)
0 0 0 0 0 0
3 3 3 3 3 3
1 2 3 4
而当样例的输入为:
1 2 3 4 5 6
输出为:(此时是vector对象操作后的值)
1 2 3 4 5 6
0 0 0 0 0 0 1 2 3 4 5 6
3 3 3 3 3 3 1 2 3 4 5 6
1 2 3 4 1 2 3 4 5 6
首先,这里的添加值操作是push_back是将数值添加到数组的末端(后续会有其他的)。那么我们根据这些很显然可以看出这些初始化的操作。
vector<int> a; 定义一个int类型的空vector对象a
vector<int> b(n) ; //定义一个int类型初始有n个默认值0的vector对象b
vector<int> c(n , 3) ; //定义一个int类型初始有n个自定义值3的vector对象c
vector<int> d{1 , 2 , 3 , 4} ; //定义一个int类型初始值为1,2,3和4的vector对象d(综上来说,也就是没有圆括号或花括号则为空,有圆括号则为定义数量且值默认,有括 号则是定义数量与初值)
2.其他类型的初始化
引例
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<string> a = {"2024年" , "新年" , "快乐" , "!"};
vector<string> b = {8 , "vector"};
//定义一个string型的vector对象a并赋予初值
for (auto i : a) //遍历a中的值
{
cout << i << " "; //输出值
}
cout << endl;
for (auto i : b)
{
cout << i << " ";
}
return 0;
}
输出为:
2024年 新年 快乐 !
(今天是大年初一,祝朋友们新年快乐,祝认真读到这里的朋友们天天快乐。)
四、操作vector对象
1.push_back
在第三个板块我们就看到了一个值操作,a.push_back(x)。通过输入输出的测试我们也看到这是将x放在a的末端,接下来看一下其他的操作。
2.引例-其他的常用操作
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<string> a = {5 , "久夏"}; //定义一个string型的对象a
vector<string> b ;
cout << "判空操作" << a.empty() << endl; //判断vector对象a内部是否为空,空输出1非则为0
cout << "元素个数" << a.size() << endl; //返回vector对象a的元素个数
cout << "位置引用" << a[3] << endl; //返回vector对象a在第3个位置上的引用,注意从0开始
b = a; //用a中的元素拷贝替换b中的元素
if (b == a)
{
cout << "判断相等操作条件成立输出1" << endl;
}
else
cout << "判断相等操作条件不成立输出0" << endl;
if (b != a)
{
cout << "判断不等操作条件成立时输出1" << endl;
}
else
cout << "判断不等操作条件不成立输出0" << endl;
if (b[3] > a[2])
{
cout << "判断大于操作条件成立输出1" << endl;
}
else
cout << "判断大于操作条件不成立输出0" << endl;
return 0;
}
最后,现在是大年初一的晚上9点06分,好累,我要去打游戏了,先这么发吧。