有没有办法使用 transform 而不是 for_each 来实现这个?如果是,这样做真的更好吗?

Is there a way to implement this using transform instead of for_each? If yes, is it actually better to do so?

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

我最初的想法是使用转换,但我不确定如何实现 "increment value if exists, else add" 部分。我最终改用 for_each。

使用for_each:

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

我希望能够做这样的事情,但是对于 map 而不是 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 有点长时才有用。