有没有办法使用 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
有点长时才有用。
给定一个字符串 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
有点长时才有用。