为什么这题用vector会写挂

P3613 【深基15.例2】寄包柜

lucy2012 @ 2024-04-27 21:44:23

发帖.感想:QwQ

#include<bits/stdc++.h>
using namespace std;
int n,p,num,i,j,k; 
vector<vector<int> > v;
int main(){
    cin>>n>>p;
    while(p--){
        cin>>num;
        if(num==1){
            cin>>i>>j>>k;
            v[i][j]=k;
        }else{
            cin>>i>>j;
            cout<<v[i][j]<<endl;
        }
    }
    return 0;
}

by cj180202 @ 2024-04-27 21:47:18

v[i][j]=k;

你直接进行了赋值,却没有事先说明 v_i 的大小,这样的话会越界。

resize 即可。


by cj180202 @ 2024-04-27 21:47:29

@lucy2012


by sto__Liyhzh__orz @ 2024-04-27 21:48:29

有没有一种可能,vector<vector<int> >v 一开始没有元素,需要 push_back


by lucy2012 @ 2024-04-27 21:50:46

@cj180202 是必须resize吗? 像这样?

#include<bits/stdc++.h>
using namespace std;
int n,p,num,i,j,k; 
int main(){
    cin>>n>>p;
    vector<vector<int> > v(n+1);
    while(p--){
        cin>>num;
        if(num==1){
            cin>>i>>j>>k;
            if(v[i].size()<j+1)
                v[i].resize(j+1);
            v[i][j]=k;
        }else{
            cin>>i>>j;
            cout<<v[i][j]<<endl;
        }
    }
    return 0;
}

by lucy2012 @ 2024-04-27 21:53:04

@Liyhzh_C202712 这个一开始就往v里塞东西了吧。。毕竟我改后的代码可以欸


by lucy2012 @ 2024-04-27 21:55:43

@cj180202 @Liyhzh_C202712 就是为什么要resize 。。QwQ不过还是谢谢啦!


by cj180202 @ 2024-04-27 22:28:03

@lucy2012 需要 resize 是因为开始时没有指定 vector 的长度,直接访问位置会像数组一样越界,而 resize 之后 vector 就有长度了,直接访问即可。


by lucy2012 @ 2024-04-27 22:29:09

@cj180202 懂了,谢谢!


|