[c++]map をつかって出現する文字列にインデックスをふる方法。

Topcoder の問題とかやっていて、与えられた文字の配列を動的にインデックスふる方法がぱっとおもいつかなかったのでメモ。

#define FOR(i,a,b) for(int (i)=(a);i<(b);i++)
#define REP(i,n) FOR(i,0,n)
#define RANGE(vec) (vec).begin(),(vec).end()

using namespace std;

int getIndex(map<string,int> &am, string key) {
    am.insert(make_pair(key, am.size()+1));
    return am[key];
}
int main(int argc, char *argv[])
{
    vector<string> strs = {
        "adfUfn8efw21",
        "xriewfd33333",
        "die232b34ffd",
        "0324fdakdfad",
        "xxxf938hfefd",
        "98347njfdfda",
        "a",
        "b",
        "c",
        "a",
        "a",
        "a",
        "c",
        "xxxf938hfefd",
        "98347njfdfda"
    };
    map<string, int> am;

    REP(i, strs.size())
        cout<<strs[i]<<":"<<getIndex(am, strs[i])<<endl;
    return 0;
}
adfUfn8efw21:1
xriewfd33333:2
die232b34ffd:3
0324fdakdfad:4
xxxf938hfefd:5
98347njfdfda:6
a:7
b:8
c:9
a:7
a:7
a:7
c:9
xxxf938hfefd:5
98347njfdfda:6

c++ map の insert はすでに登録済みの key があったら上書きしない。

am.find(key) == am.end()

みたいなチェックは不要。知らなかった。