競プロでよく使うC++関数・データ構造まとめ(自分用メモ、出会ったら随時追加)
queue
・要素を末尾に追加
queue.push(val)
・オブジェクトの追加
queue.emplace(val1, val2)
・最初の要素取り出し
val = queue.front()
・最初の要素削除、frontとセットで叩くことが多い
queue.pop()
priority_queue
q.top()
q.pop()
q.size()
・宣言(小さい順に並び替え、デフォルトは大きい順)
priority_queue<int,vector<int>,greater<int> > que;
string
-
数値に治す
int = stoll(string) -
数値から文字列
string = to_string(int) -
部分取り出し (l から l + r - 1文字目まで)
s.substr(l, r)
s.substr(l)
map
-
値の追加
map[key] = val -
値の削除
map.erase(key) -
Keyが存在するか
map.count(key)
deque
-
先頭に追加
deque.push_front() -
末尾に追加
deque.push_back() -
先頭にアクセス
deque.front() -
末尾にアクセス
deque.back() -
i番目にアクセス
deque[i] -
先頭削除
deque.pop_front() -
末尾削除
deque.pop_back() -
空かどうか
deque.empty()
Stack
配列
- 最小値
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)
特殊なソート
Set
-
追加
s.insert(v) -
存在
s.count(v) -
要素
*s.begin()
#gcd algorithmのincludeが必要
- 最大公約数 [log a]
val = _gcd(a, b) - 最小公倍数
val = a / _gcd(a, b) * b
細々関数
- 変数の交換
swap(a, b)
順列全列挙
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()));
Atcoder Libraryにあるもの
- modint
modint.val()
Pair
-
宣言
pair<int, int> p;
vector<pair<int, int>> pvec; -
追加
pvec.push_back(pair (v1, v2) ); -
読取
for ( auto &i : pvec ) i.first, i.second
組み合わせ
- set pair
pos.begin() -> first
変換
- double to int(切り捨て)
floor(double) - double to int(四捨五入)
round(double)
bit
- AND
a & b - OR
a | b - XOR
a ^ b
tuple
- 代入
tup = tie(a, b, c); - 出力(3番目の要素)
cout << get<2>(p[i]) << endl;
数値<改行>文字列<改行> という入力形式を読み込みたい時
int n; std::string s;
cin >> n; cin.ignore();
getline(cin, s);
char からintに治す
int ctoi(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
}
return 0;
}
少数系
四捨五入 round(x)
切り捨て (int)で変換
小数点N位まで表示 cout << std::fixed << std::setprecision(3);
小数点N位まで計算 cout << round(ans * 1000) / 1000 << endl;