はじめに
競技プログラミングの問題でキーごとに出現回数をカウントするシーンが多くあります。この制御をC++のstd::mapを使って実装します。
実装
#include <map> using namespace std; template <typename K, typename V, typename A> void map_count (map<K, V> &mapBuff, A a){ for(auto c : a) { if (mapBuff.count(c) == 0 ) { mapBuff.insert(make_pair(c, 1)); } else { auto it = mapBuff.find(c); mapBuff.insert(make_pair(c, it->second++)); } } }
使用例
atcoder.jp
上記に使ってみました*1。
#include <iostream> #include <string> #include <map> using namespace std; template <typename K, typename V, typename A> void map_count (map<K, V> &mapBuff, A a){ for(auto c : a) { if (mapBuff.count(c) == 0 ) { mapBuff.insert(make_pair(c, 1)); } else { auto it = mapBuff.find(c); mapBuff.insert(make_pair(c, it->second++)); } } } int main() { string s; string ans = "Yes"; cin >> s; map<char, int> m; map_count(m,s); for(auto i = m.begin(); i != m.end(); ++i){ if ( i->second != 2 ) { ans = "No"; } } cout << ans << endl; }
こちらの問題にも対応できます。
atcoder.jp
制御の名前
本記事では集約処理としましたが、一意に呼び方が決まってはいないようです。以下は一例です。
- 集約処理
- 頻度
- 古い値に基づいた値の更新
- マップカウント*2
Twitterでも少し話題になっていました。
意外と名前が付いているテクニックもあって、「重複のあるデータ列が与えられた時に、データ名:個数のペアに持ち変える」みたいなのって、名前がついてるはずなんだよね。自分も思い出せないし言っても多分伝わらないけど。
— chokudai(高橋 直大)🍆 (@chokudai) 2020年4月30日
おわりに
C++ともう少し仲良くなれればと思います。