给定一个字符串s,我如何使用transform来创建一个包含每个字符遇到次数的unordered_map?这值得打扰吗?
我最初的想法是使用转换,但我不确定如何实现“增量值,如果存在,否则添加”部分。我最终使用了for_each。
使用for_each:
unordered_map<char, int> charMap;
for_each(begin(s), end(s), [&charMap](char c){charMap[c]++;});
我希望能够做这样的事情,但对于地图而不是multimap:
unordered_multimap<char, int> charMap2;
transform(begin(s), end(s), inserter(charMap2, begin(charMap2)), [&](char c){
return make_pair(c, 1);
});
更新:请参阅@ patatahooligan的评论为什么,尽管可以使其成功,但转换(用于1对1转换)可能不适合这里。有关更合适的策略,请参阅Maxim的(已接受)答案。
我不认为你可以在编译时,执行速度和可读性方面比普通的range-for循环更好:
unordered_map<char, int> charMap;
for(char c : s)
++charMap[c];
如果用unordered_map<char, int>
替换int[256]
,你可以更快:
int charMap[UCHAR_MAX + 1] = {}; // Zero-initialized.
for(unsigned char c : s)
++charMap[c];
如果你确实需要unordered_map<char, int>
,你可以从那个int[256]
数组构建它:
unordered_map<char, int> charMap2;
for(auto const& count : charMap)
if(count)
charMap2[&count - charMap] = count;
我想,使用int charMap[256]
只有当字符串s
有点长时才能得到回报。