C++ 有没有一种方法可以使用transform而不是for_来实现这一点?如果是,这样做是否真的更好?

C++ 有没有一种方法可以使用transform而不是for_来实现这一点?如果是,这样做是否真的更好?,c++,algorithm,stl,unordered-map,C++,Algorithm,Stl,Unordered Map,给定一个字符串s,如何使用transform创建包含每个字符遇到次数的无序_映射?值得这么麻烦吗 我最初的想法是使用transform,但我不确定如何实现“如果存在增值,否则添加”部分。结果我用for_代替了 分别用于以下各项: unordered_map<char, int> charMap; for_each(begin(s), end(s), [&charMap](char c){charMap[c]++;}); unordered_-map charMap; 对于每

给定一个字符串s,如何使用transform创建包含每个字符遇到次数的无序_映射?值得这么麻烦吗

我最初的想法是使用transform,但我不确定如何实现“如果存在增值,否则添加”部分。结果我用for_代替了

分别用于以下各项:

unordered_map<char, int> charMap;
for_each(begin(s), end(s), [&charMap](char c){charMap[c]++;});
unordered_-map charMap;
对于每个字符(开始、结束、[&charMap](charc){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);
        });
unordered_multimap charMap2;
转换(开始),结束,插入器(charMap2,开始(charMap2)),[&](charc){
返回make_对(c,1);
});
更新: 请参阅@patatahooligan的评论,了解为什么转换(用于1对1转换)可能不是最适合这里的,尽管可以进行足够的黑客攻击以使其工作。
有关更合适的策略,请参见Maxim(公认)的答案

我不认为在编译时间、执行速度和可读性方面,它比普通的for循环更好:

unordered_map<char, int> charMap;
for(char c : s) 
    ++charMap[c];
如果您确实需要
unordered_map
,您可以从
int[256]
数组中构建它:

unordered_map<char, int> charMap2;
for(auto const& count : charMap)
    if(count)
        charMap2[&count - charMap] = count;
unordered_-map charMap2;
用于(自动常量和计数:charMap)
如果(计数)
charMap2[&count-charMap]=计数;

我想,只有当字符串
s
有点长时,使用
int charMap[256]
才有效。

我会使用普通循环。为什么您认为这需要改进?我没有具体说明,但考虑到我想要获取一个范围,应用一个转换并将其粘贴到另一个容器中,我认为我应该能够使用转换来完成这项工作。我很好奇这是否可能。我明白了,我不是想说“wtf不要做”,但这也只是好奇;)@varjun此代码对每个组进行
groupby
count
聚合。C++标准库不提供<代码> GROPBI< /COD>code>unordered_map为您提供了
groupby
功能,但您仍然需要手动应用聚合功能。据我所知,
std::transform
用于1-1转换,即当输出的每个元素对应于输入的一个元素时。这里不是这样。虽然您可以破解一个输出迭代器使其工作,但这并不意味着
std::transform
是适合此工作的工具
unordered_map<char, int> charMap2;
for(auto const& count : charMap)
    if(count)
        charMap2[&count - charMap] = count;