今回はmapの復習をしました。
一度実装しても忘れがち…
mapはキーとそれに対応する値を格納できるものなのだそうで、
map<"キーの型","値の型"> 名前;
という形でmapを作ることができます。型は、intとかstringとか…
私が今の所使ったのは「入力された中の要素の数を数えるためのmap」。
先に、「入力に対し初見の要素ならキーを作成し、既視の要素なら値を1増やす」という関数を定義します。
void increment (map<int, int>& m, int i) {
auto itr = m.find(i); //itrはmの中でキーiを探す矢印
if (itr != m.end()) { //矢印がmのキーの中で最後まで行かない時(つまりどこかで「見つけた!」と止まった時
itr->second += 1; //その矢印が指すキーに対応する値に1を足す
} else {
m[i] = 1; //矢印が最後まで行ってしまう(つまりキーがない)時キーと、それに対応する値として1を作る
}
}
と、こんな感じ。
これで、main関数の方で increment("マップ名","キー"); と入れるだけで同じ行為をどんなmap、どんなキーにもさせることができます。
こうして作ったmap内の各要素に対し、例えば「あるキーの値が奇数ならカウントせよ」などとさせたいときには
int count = 0;
for(auto&&kv:m){
if(kv.second%2==1) ++count;
}
とこうするとカウントできます。
mapではないけれど他の問題も。
これは驚きの簡単さでした…main関数の中身が最短4行で終わる。