首页 > 解决方案 > 有没有办法使用转换而不是 for_each 来实现这一点?如果是的话,这样做真的更好吗?

问题描述

给定一个字符串 s,我如何使用 transform 来创建一个 unordered_map,其中包含每个字符出现的次数?值得麻烦吗?

我最初的想法是使用转换,但我不确定如何实现“如果存在则增加值,否则添加”部分。我最终改用了 for_each 。

使用 for_each:

unordered_map<char, int> charMap;
for_each(begin(s), end(s), [&charMap](char c){charMap[c]++;});

我希望能够做这样的事情,但是对于地图而不是多地图:

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 的(已接受)答案。

标签: c++algorithmstlunordered-map

解决方案


我不认为在编译时间、执行速度和可读性方面比普通的 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有点长时才使用。


推荐阅读