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になる