Open20

競プロでよく使うC++関数・データ構造まとめ(自分用メモ、出会ったら随時追加)

RockyRocky

queue

・要素を末尾に追加
queue.push(val)

・オブジェクトの追加
queue.emplace(val1, val2)

・最初の要素取り出し
val = queue.front()

・最初の要素削除、frontとセットで叩くことが多い
queue.pop()

RockyRocky

priority_queue

q.top()
q.pop()
q.size()
・宣言(小さい順に並び替え、デフォルトは大きい順)
priority_queue<int,vector<int>,greater<int> > que;

RockyRocky

string

  • 数値に治す
    int = stoll(string)

  • 数値から文字列
    string = to_string(int)

  • 部分取り出し (l から l + r - 1文字目まで)
    s.substr(l, r)
    s.substr(l)

RockyRocky

map

  • 値の追加
    map[key] = val

  • 値の削除
    map.erase(key)

  • Keyが存在するか
    map.count(key)

RockyRocky

deque

  • 先頭に追加
    deque.push_front()

  • 末尾に追加
    deque.push_back()

  • 先頭にアクセス
    deque.front()

  • 末尾にアクセス
    deque.back()

  • i番目にアクセス
    deque[i]

  • 先頭削除
    deque.pop_front()

  • 末尾削除
    deque.pop_back()

  • 空かどうか
    deque.empty()

RockyRocky

配列

  • 最小値
    min(a)
  • 最大値
    max(a)
  • 降順(大きい順ソート)
    #include <functional>
    sort(a.begin(), a.end(), greater<int>())
  • val以上の最小の値
    *lower_bound(a.begin(), a.end(), val)
  • valを超える最小の値
    *upper_bound(a.begin(), a.end(), val)
  • l から r - 1で最小のもの (要algorithm)
    *min_element(c + l, c + r)
  • l から r - 1で最大のもの (要algorithm)
    *max_element(c + l, c + r)

特殊なソート
https://algo-method.com/descriptions/139

RockyRocky

#gcd algorithmのincludeが必要

  • 最大公約数 [log a]
    val = _gcd(a, b)
  • 最小公倍数
    val = a / _gcd(a, b) * b
RockyRocky

順列全列挙

int array[]={1,2,3,4};
    do{
        for(int i=0; i<4; i++){
            cout<<array[i];
            if(i!=3)cout<<" ";
        }
        cout<<endl;
    }while(next_permutation(array.begin(),array.end()));
RockyRocky

Pair

  • 宣言
    pair<int, int> p;
    vector<pair<int, int>> pvec;

  • 追加
    pvec.push_back(pair (v1, v2) );

  • 読取
    for ( auto &i : pvec ) i.first, i.second

RockyRocky

変換

  • double to int(切り捨て)
    floor(double)
  • double to int(四捨五入)
    round(double)
RockyRocky

tuple

  • 代入
    tup = tie(a, b, c);
  • 出力(3番目の要素)
    cout << get<2>(p[i]) << endl;
RockyRocky

数値<改行>文字列<改行> という入力形式を読み込みたい時
int n; std::string s;
cin >> n; cin.ignore();
getline(cin, s);

RockyRocky

char からintに治す
int ctoi(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
}
return 0;
}

RockyRocky

少数系
四捨五入 round(x)
切り捨て (int)で変換
小数点N位まで表示 cout << std::fixed << std::setprecision(3);
小数点N位まで計算 cout << round(ans * 1000) / 1000 << endl;