【自分用】C++競技プログラミング向けチートシート
少しずつトピックスを追加していきたいです。
サンプルコードは下記リファレンスを参考に書いています。
std::vector
可変長配列。 for文でvectorの各要素にアクセスする記法は、 自分の環境(Apple LLVM version 10.0.0 (clang-1000.10.44.4))ではコンパイル時に'-std=c++11'オプションを付ける必要があった。
サンプルコード
#include <iostream> #include <vector> int main() { std::vector<int> v = {}; for (int i = 0; i < 10; i++) v.push_back(i); // 末尾にiを追加していく v.insert(v.end(), 10); // 末尾に10を挿入 for (int x:v) std::cout << x << std::endl; // vの全要素を出力 }
実行結果
0 1 2 3 4 5 6 7 8 9 10
std::transform
Pythonでいうmap。
サンプルコード
#include <iostream> #include <vector> int main() { std::vector<int> v = {}; for (int i = 0; i < 10; i++) v.push_back(i); // 末尾にiを追加 v.insert(v.end(), 10); // 末尾に10を挿入 // vの全要素を非破壊的に2倍してresultにコピー std::vector<int> result = {}; std::transform(v.begin(), v.end(), std::back_inserter(result), [](int x) {return x*2;}); for (int x:result) std::cout << x << std::endl; // vの全要素を出力 // vの全要素を破壊的に3倍 std::transform(v.begin(), v.end(), v.begin(), [](int x) {return x*3;}); for (int x:v) std::cout << x << std::endl; }
実行結果
0 2 4 6 8 10 12 14 16 18 20 0 3 6 9 12 15 18 21 24 27 30
resultへのコピーでback_inserterを使わずにresult.begin()とした場合、コンパイルは通るが実行時にSegmentation faultを起こした。 理由はまだよくわかっていない。