YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

std::mapを使った集約処理

はじめに

競技プログラミングの問題でキーごとに出現回数をカウントするシーンが多くあります。この制御を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

制御の名前

本記事では集約処理としましたが、一意に呼び方が決まってはいないようです。以下は一例です。

Twitterでも少し話題になっていました。

おわりに

C++ともう少し仲良くなれればと思います。

ちなみに

Rustだとstd::collections::HashMapを使って実装できます。めちゃお世話になっています。
doc.rust-jp.rs


*1:こんなことしなくても要素の比較で解けますが

*2:私が勝手につけた名前