Open6
APG4bで得られた知見メモ(C++)
ピン留めされたアイテム
アルゴリズムとかではなく、忘れそうな構文などについてのメモです。
C++ではswitch構文の条件式はint型のみ。(文字列はエラー)
↓ダメな例
int A, B;
string op;
cin >> A >> B >> op;
switch (op) {
case "+":
cout << A + B << endl;
break;
case "-":
......
文字列を比較したいときはif文を使う必要あり。
int A, B;
string op;
cin >> A >> B >> op;
if (op == "+") cout << A + B << endl;
if (op == "-") ......
文字列に対する操作
文字列の長さを取得
size()を利用する。
string str = "pasta";
cout << str.size() << endl; // '5'が出力
文字列のn文字目を取得
at()を利用する。
文字数と添字が違うことに注意。
string str = "pasta";
cout << str.at(2) << endl; // 's'が出力
文字列のメンバ関数の利用
" "の末尾にsをつける。
cout << "pasta"s.size() << endl; // '5'が出力
行単位の入力
getline()を利用する。
string str;
getline(cin, str); // cin >> getline(str) などとしない
cout << str << endl;
標準入力
I ate pasta.
標準出力
I ate pasta.
配列に対する操作
宣言
vector<型> 配列名(要素数);
vector<型> 配列名(要素数, 初期値); // 初期値設定する場合
要素の追加、削除
追加はpush_back()、削除はpop_back()
どちらも末尾に追加削除される
vector<string> pasta = {"spaghetti", "linguine"};
pasta.push_back("fettuccine");
cout << pasta.at(2) << endl; // fettuccineが出力
pasta.pop_back();
cout << pasta.at(2) << endl; // エラー
配列の色々
基本的にはvectorがいいらしい。
vector<int> data(3); // vectorによる配列
int data[3]; // Cの配列
array<int, 3> data; // arrayによる配列
多次元配列
// 二次元配列の宣言
vector<vector<要素の型>> 変数名(要素数1, vector<要素の型>(要素数2, 初期値));
// 三次元配列の宣言
vector<vector<vector<要素の型>>> 変数名(要素数1, vector<vector<要素の型>>(要素数2, vector<要素の型>(要素数3, 初期値)));
vector<vector<vector<要素の型>>> 変数名(要素数1, vector<vector<要素の型>>(要素数2, vector<要素の型>(要素数3))); // 初期値を省略
その他
配列の比較は配列変数同士じゃないとダメ。
STL関数
min(a,b)
max(a,b)
swap(a,b)
sort(vec.begin(), vec.end()) (昇順に並べる)
reverse(vec.begin(), vec.end()) (逆順にする)
応用
降順にするにはsortしてからreverse
拡張for文(範囲for文)での落とし穴
// 標準入力 -> 3 1 4 1 5 9 2 6 5 3
vector<int> pie (10);
//pieに標準入力を代入するとき
// 普通のfor文(問題なし)
for (int i = 0; i < 10; i++) {
cin >> pie.at(i);
}
// 誤った拡張for文
for (int i : pie) {
cin >> i; // 意味なし
}
// 正しい拡張for文
for (int &i : pie) {
cin >> i;
}
表示などを行う場合には値渡しでいいが、
配列に変更を加えるときは参照渡しにする必要がある。