c++ - 有没有办法使用转换而不是 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 的(已接受)答案。
解决方案
我不认为在编译时间、执行速度和可读性方面比普通的 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
有点长时才使用。
推荐阅读
- docker - 构建并运行 Quarkus 的 Docker 镜像
- javascript - 使用钩子的 react-sortable-tree Crud 操作
- java - java 8 日期/时间 API:使用通用日期/时间格式解析以提取自纪元以来的毫秒数
- php - PHP7 +中的任何方式通过方括号将对象视为数组?
- jenkins - 从詹金斯发送黄瓜关于松弛的报告
- python - 无法启动 ipython 内核 Python 3.8.5
- r - 如果返回错误,如何在 R 中的循环中跳过一个项目?
- javascript - 返回函数的函数,即在其中声明的函数
- javascript - 如何在反应中注入javascript变量?
- mediawiki - 如何在 EnsiWiki 上以优雅的方式解析参考书目