Open6

APG4bで得られた知見メモ(C++)

ピン留めされたアイテム
pastapasta

アルゴリズムとかではなく、忘れそうな構文などについてのメモです。

pastapasta

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 == "-") ......
pastapasta

文字列に対する操作

文字列の長さを取得

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.
pastapasta

配列に対する操作

宣言

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)));  // 初期値を省略

その他

配列の比較は配列変数同士じゃないとダメ。

pastapasta

STL関数

min(a,b)
max(a,b)
swap(a,b)
sort(vec.begin(), vec.end()) (昇順に並べる)
reverse(vec.begin(), vec.end()) (逆順にする)

応用

降順にするにはsortしてからreverse

pastapasta

拡張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;
}

表示などを行う場合には値渡しでいいが、
配列に変更を加えるときは参照渡しにする必要がある。