学习B站视频:vector

知识点:

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

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值