我正在尝试计算一个词在 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/