知识点:
vector 动态数组,就是数组的长度可以变化,引入vector的头文件为#include <vector>或者#include <bits/stdc++.h>(万能)
定义方式为 vector</*数据类型*/> /*名称*/;
比如:
vector<int> vec;
定义一个叫vec的int类型的动态数组,
用push_back(/*元素*/) 可以在动态数组最后插入一个新的元素,比如:
vector<int> vec;//目前:[]
vec.push_back(1);//目前:[1]
vec.push_back(2);//目前:[1,2]
vec.push_back(3);//目前:[1,2,3]
如果要删除元素,可以用pop_back()删除动态数组中的最后一个元素;注意这里括号内不要加东西;如果动态数组内已经为空,再使用pop_back()会出错!
访问动态数组的长度,用/*数组名称*/.size(),比如:vec.size();
访问动态数组中的某个元素跟普通的数组访问方式一样,比如vec[0],但是注意不要超过数组大小范围,动态数组大小范围为vec.size()-1
输出一个动态数组里的所有数据像这样:
vector<int>vec;
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<" ";
}
如果你想修改动态数组中的某个值也跟普通数组一样
vector<int>vec;
vec.push_back(1);
vec.push_back(2);
vec[0]=2;
vec[1]=1;
动态数组清空所有数据且释放内存格式为:vector</*数据类型*/>().swap(/*名称*/);比如
vector<int>().swap(vec);
你也可以使用/*名称*/.empty()来检测这个动态数组的大小是否为0;
动态数组可以整体赋值,比如
vector<int>vec1;
vector<int>vec2;
vec1.push_back(1);
vec2=vec1//使vec2与vec1一模一样
动态数组的排序 需要使用迭代器(vec.begin(),vec.end()),
如果全排序则像这样:sort(vec.begin(),vec.end());
如排序前面3个数则:sort(vec.begin(),vec.begin()+3);
vector数据类型也可以自定义,(以及自定义结构体数据类型对于动态数组的常见操作)比如:
struct Stu{
string name;
int score;
};
int main(){
vector<Stu>vec;
Stu a;//定义学生a
a.name ="abc";//赋值
a.score =100;
vec.push_back(a);//将a压入vec
vec.push_back("abcd",90);//或者这样一步完成
}
想要动态数组初始化一个数或者数组大小:vector</*数组类型*/>/*数组名*/(/*大小*/,/*值*/);
vector<int>vec(100,0);//设置大小为100且所有数为0的动态数组
例题1:
学校合唱比赛,学生排队报名,时不时要当前队伍某个区间的学生按照身高从小到大排序,问最后同学的身高排序。(用动态数组完成)
输入:第一行包含一个正整数q(1<q<1000),q代表操作,同学报名或老师排序;
接下来q行每行首先输入一个整数op 当op ==1时,代表同学报名,接下来输入1个整数h,表示当前报名的学生身高。当op==2时,代表老师要进行排序,接下来输入两个整数x、y,表示要对当前第x个学生到第y个学生进行排序。
输出格式:输出共一行,最后同学的身高排序。同学身高之间用一个空格隔开。
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> vec;
int q;
cin>>q;
while(q--){
int op;
cin>>op;
int a;
if(op == 1){
cin>>a;
vec.push_back(a);
}else{
int b;
cin>>a>>b;
a--;
b--;
sort(vec.begin()+a,vec.begin()+b+1);
}
}
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<" ";
}
}
例题2:
有一个宝石收藏家,将所有宝石排序,从编号1开始。他每次去市场都会买若干个相同的宝石,并将它们依次存入末尾。有时他缺钱了会将最近购买的宝石依次按原价出售,凑够自己需要的钱(卖完所有宝石一定能凑够自己需要的钱)。每次卖了宝石多余的钱,就被他直接花掉了。
现给出他n次购买和缺钱的操作,问他最后的宝石收藏列表。
输入:第一行包括1个正整数n(1≤n≤10^5),代表操作次数;
接下来n行每行首先输入一个整数op,当op==1时表示购买了宝石,接下来输入一个字符串与两个整数s、p、k,分别表示宝石名称(由小写字母组成)、宝石单价、购买个数。当op==2时表示缺钱了,接下来输入一个整数x,表示缺钱的钱数。1≤p,x<10^6,∑k<10^6,购买的宝石数<10^6
输出:输出一行,按顺序输出宝石收藏,宝石名之间用空格隔开
#include<iostream>
#include<vector>
using namespace std;
struct Gym{
string name;
int price;
};
int main(){
int n;
cin>>n;
vector<Gym> vec;
while(n--){
int op,k;
cin>>op;
if(op == 1){
Gym a;
cin>>a.name>>a.price>>k;
for(int i=0;i<k;i++){
vec.push_back(a);
}
}else{
int need;
cin>>need;
while(need>0){
need-=vec[vec.size()-1].price;
vec.pop_back();
}
}
}
for(int i=0;i<vec.size();i++){
cout<<vec[i].name<<" ";
}
return 0;
}
例题3
小A参加节目组海选,海选时间共x个小时(如果最后一个人开始表演的时间等于或早于x个小时,评委会看完表演再离开。),评委耐心邮箱,如果有人表现太差,会刚开口就被pass掉,这段时间可以忽略不计。现给出每个报名节目的 名称 和 时长,按照先后顺序表演,问小A能否表演
输入:第一行输出一个正整数x(1<x<100)表示海选时间,以小时为单位
接下来若干行,以文字结束符作为结束。每行先输入一个字符才能,长度不超过100,若字符串味"tingtingting"则代表之前的这个选手被刚下来(即文字结束符,评委叫停选手下台);如果字符串不是,则代表节目名称,并且再输入一个整数t表示节目时长,单位为分钟
输出:小A表演的节目叫kaomianjin 如果小A没有得到展示机会,输出"Unfortunately.";如果成功展示,"Congratulations!";如果直接被刚下台,输出"Hahaha."
#include<bits/stdc++.h>
using namespace std;
struct A{
string name;
int t;
};
int main(){
int n;
vector<A>vec;
string a;
cin>>n;
n*=60;
int recent;
while(cin>>a){
if(a == "tingtingting"){
n+=vec[vec.size()-1].t;
vec.pop_back();
}else{
A stu;
stu.name = a;
cin >> stu.t;
recent = stu.t;
vec.push_back(stu);
if(a== "kaomianjin"&&n>=0){
cin>>a;
if(a=="tingtingting"){
cout<< "Hahaha.";
return 0;
}else{
cout<< "Congratulations!";
return 0;
}
}else if(a == "kaomianjin"){
cout<<"Unfortunately."
return 0;
}else{
n-=recent;
}
}
}
}
好了,基础知识就简单介绍到这里了。
本篇内容转载至B站视频(up的id:JustinProgrammer)【10分钟入门vector】 https://www.bilibili.com/video/BV1S14y1a7d1/?share_source=copy_web&vd_source=a5d9e14de65930667d4afc96bea331ab