個人的な学習メモ用として標準入力に関するパターンを適宜追記していきます。
扱いやすさの観点から配列に関しては基本的にvectorを使う方針でいきます。
Pattern1 : 1行目に行数のN,以降が数値N行
例)
3
1
2
3
■適宜読み取って処理をしたいとき
#include <iostream>
using namespace std;
int main(void){
int N;
cin >> N;
int a;
for(int i=0; i<N; i++){
cin >> a;
}
return 0;
}
■1次元配列aに格納したいとき
#include <bits/stdc++.h>
using namespace std;
int main(void){
int N;
cin >> N;
vector <int> a(N);
for(int i=0; i<N; i++) cin >> a[i];
return 0;
}
Pattern2 : 1行目に行数H(高さ)と1行ごとの数値の数W(幅)が与えられるパターン
Excelチックなマス目上の題材のときに頻出
例)
3 5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
■2次元配列aに格納したいとき
#include <bits/stdc++.h>
using namespace std;
int main(void){
int H, W;
cin >> H >> W;
vector<vector<int>> a(H, vector<int>(W));
for(int i=0; i<H; i++){
for(int j=0; j<W; j++) cin >> a[i][j];
}
return 0;
}
2重ループの読み取り処理の書き方は見づらいけどこっちでもいいかも
for(int i=0; i<H; i++)for(int j=0; j<W; j++)cin>>a[i][j];
標準出力に配列の中身を出力したいときは以下
for(int i=0; i<H; i++)for(int j=0; j<W; j++) cout << a[i][j] << endl;
Pattern3 : 1行目に行数のH,以降が文字列H行で1文字ずつ区切って2次元配列に格納したいとき
※各行(W)の文字数は同じである場合に限る
※文字数固定のため使用箇所は限定的で汎用性低
4 3
abc
def
ghi
jkm
■2次元配列aに格納したいとき
#include <iostream>
#include<string>
using namespace std;
int main(void){
int H, W;
cin>>H>>W;
string str_line[H];
string a[H][W];
for(int i=0; i<H; i++)cin>>str_line[i];
for(int i=0; i<H; i++){
for(int j=0; j<W; j++)a[i][j] = str_line[i][j];
}
return 0;
}
→解いたときにこんな感じでやったけどもっと汎用性高くできる気がします