死んだ魚の目

Web放浪記

【自分用】C++競技プログラミング向けチートシート

主に競技プログラミング向けの自分用C++チートシートです。

少しずつトピックスを追加していきたいです。

サンプルコードは下記リファレンスを参考に書いています。

cpprefjp.github.io

std::vector

cpprefjp.github.io

可変長配列。 for文でvectorの各要素にアクセスする記法は、 自分の環境(Apple LLVM version 10.0.0 (clang-1000.10.44.4))ではコンパイル時に'-std=c++11'オプションを付ける必要があった。

処理系 - cpprefjp C++日本語リファレンス

サンプルコード

#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

cpprefjp.github.io

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を起こした。 理由はまだよくわかっていない。