vectorとsetとmapと
vector,set,mapをよく間違えるのでメモ.
vector
配列っぽいもの
だいたいの関数はstringでも使えるので記憶力をあまり使わないで済むことに気付いた
- 追加:vector.push_back(src);
- 先頭参照:vector.front();
begin()はイテレーターを返却するが,front()は値を返却する - 末尾取出:vector.back();
vector.end()-1;をしなくて済む(begin()に対するend()の非対称性が気になっていた人並み) - 末尾削除(取り出しではない):vector.pop_back();
- 削除:vector.erase(itr);
部分削除はvector.erase(開始itr, 終端itr);で第2引数は長さではないことに注意. - 要素番号を得る:distance(vector.begin(), itr);
返却値の型はstd::size_tであることに注意. - ソート:sort(vector.begin(), vector.end()); // #include <algorithm> すること
ちなみに標準では昇順ソート.降順ソートは sort(vector.begin(), vector.end(), std::greater<int>());
//sort用に演算子をオーバーロード bool operator<(const struct_name& right) const { return hoge == right.hoge ? true : hoge < right.hoge; }
構造体かつ降順にソートしたい場合は上記のオーバーロードに加えて以下のようにしてソートする(リンク先はコード例)
sort(v.rbegin(), v.rend());
set
追加したら即時,昇順にソートされる
multisetもある
追加:set.insert(src);
探索:イテレーター(ランダムアクセス不可)
multiset
setで複数の値を持つことができるやつ
map
keyとvalueを持つ(せいでsetと間違える)
valueではsortできない
追加:map[key]=value;(map[key]が存在しない場合)
探索:map.find(key);(存在しない場合はmap.end()を返却)(valueから探すにはイテレーターしかない?)
イテレーターで舐める場合は,keyがitr->first,valueがitr->secondになる