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

问题描述 投票:3回答:1

给定一个字符串s,我如何使用transform来创建一个包含每个字符遇到次数的unordered_map?这值得打扰吗?

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

使用for_each:

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

我希望能够做这样的事情,但对于地图而不是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的(已接受)答案。

c++ algorithm stl unordered-map
1个回答
4
投票

我不认为你可以在编译时,执行速度和可读性方面比普通的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有点长时才能得到回报。

© www.soinside.com 2019 - 2024. All rights reserved.