c++ - 计算一个词在 map 中出现的次数 - 使用 transform() - 调用不匹配

标签 c++ algorithm dictionary vector word

我正在尝试计算一个词在 map 中出现的次数。然后,映射应该包含作为字符串的单词和作为 int 的它存在的次数。 inlist 是包含所有单词的 vector 。我首先使用第一个 transform() 创建一个映射,然后我想使用第二个 transform() 通过函数 counter() 更改映射中的整数

void input_a(vector<string> inlist)
{
    map<string, int> wordcount;

    transform(inlist.begin(), inlist.end(), inserter(wordcount, wordcount.end()), [] (string c){return make_pair(c, 0);});

    transform(wordcount.begin(), wordcount.end(), wordcount.begin(), [&inlist] (string c){return counter(c, inlist);});

函数 counter() 返回一个对,因为这是我想插入到 map 中的。

pair <string, int> counter(string word, vector<string> list)
{
    int n{1};
    n = count(list.begin(), list.end(), word);

    return make_pair(word, n);
}

我收到以下错误:

In file included from /usr/include/c++/7/algorithm:62:0,
                 from wordlist.h:7,
                 from wordlist.cc:1:
/usr/include/c++/7/bits/stl_algo.h: In instantiation of ‘_OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation) [with _IIter = std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, int> >; _OIter = std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, int> >; _UnaryOperation = input_a(std::vector<std::__cxx11::basic_string<char> >)::<lambda(std::__cxx11::string)>]’:
wordlist.cc:75:118:   required from here
/usr/include/c++/7/bits/stl_algo.h:4306:24: error: no match for call to ‘(input_a(std::vector<std::__cxx11::basic_string<char> >)::<lambda(std::__cxx11::string)>) (std::pair<const std::__cxx11::basic_string<char>, int>&)’
  *__result = __unary_op(*__first);
              ~~~~~~~~~~^~~~~~~~~~
wordlist.cc:75:89: note: candidate: input_a(std::vector<std::__cxx11::basic_string<char> >)::<lambda(std::__cxx11::string)>
 unt.begin(), wordcount.end(), wordcount.begin(), [&inlist] (string c){return counter(c, inlist);});
                                                                     ^
wordlist.cc:75:89: note:   no known conversion for argument 1 from ‘std::pair<const std::__cxx11::basic_string<char>, int>’ to ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’

最佳答案

在这次通话中

transform(wordcount.begin(), wordcount.end(), wordcount.begin(), [&inlist] (string c){return counter(c, inlist);});

您正在尝试更改 map 的键。

即 map 中的对具有类型 std::pair<const std::string, int> .您不能重新分配这样的一对。

你只需要以下内容

void input_a( const std::vector<std::string> &inlist )
{
    std::map<std::string, int> wordcount;

    for ( const auto &item : inlist ) ++wordcount[item];
    // ...
}

比多次遍历vector效率更高。

关于c++ - 计算一个词在 map 中出现的次数 - 使用 transform() - 调用不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59286827/

相关文章:

python - 将字典的字典(大小未知)写为矩阵

arrays - 对于集合类型,为什么remove方法有返回值而insert没有返回值

c# - 使用 C++ std::ofstream 时,FileSystemWatcher 不会触发

c++ - 在生产中使用 Address Sanitizer 或其他未定义的行为 sanitizer ?

c++ - 如何使用 visual studio 2017 安装程序正确设置 PCL 库?

python - 计算能力的速度(在python中)

c++ - 如何在不使用 push, pop, any 方法的情况下从堆栈中移除基本元素并以相同的顺序返回它

Python:将计数器写入 csv 文件

时间:2019-03-17 标签:c++: Pthreads or Linux processes

java - 动态 Java 整数/长溢出检查与性能