C++ 计算一个单词在映射中出现的次数-使用transform()-调用不匹配
我试图计算一个单词在地图上存在的次数。然后,映射应该包含作为字符串的单词以及作为int存在的次数。inlist是包含所有单词的向量。我首先使用第一个transform()创建一个映射,然后使用第二个transform()使用函数counter()更改映射中的intC++ 计算一个单词在映射中出现的次数-使用transform()-调用不匹配,c++,algorithm,dictionary,vector,word,C++,Algorithm,Dictionary,Vector,Word,我试图计算一个单词在地图上存在的次数。然后,映射应该包含作为字符串的单词以及作为int存在的次数。inlist是包含所有单词的向量。我首先使用第一个transform()创建一个映射,然后使用第二个transform()使用函数counter()更改映射中的int void输入_a(矢量输入列表) { 映射字数; 转换(inlist.begin()、inlist.end()、插入器(wordcount、wordcount.end())、[](字符串c){return make_pair(c,0)
void输入_a(矢量输入列表)
{
映射字数;
转换(inlist.begin()、inlist.end()、插入器(wordcount、wordcount.end())、[](字符串c){return make_pair(c,0);});
转换(wordcount.begin(),wordcount.end(),wordcount.begin(),[&inlist](字符串c){返回计数器(c,inlist);});
函数counter()返回一对,因为我想在映射中插入一对
pair <string, int> counter(string word, vector<string> list)
{
int n{1};
n = count(list.begin(), list.end(), word);
return make_pair(word, n);
}
对计数器(字符串、向量列表)
{
int n{1};
n=计数(list.begin(),list.end(),word);
返回make_对(字,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>}’
在/usr/include/c++/7/算法:62:0中包含的文件中,
从单词表h:7,
从wordlist.cc:1:
/usr/include/c++/7/bits/stl_algo.h:在“_iiterstd::transform(_IIter,_IIter,_IIter,_OIter,_OIter,_UnaryOperation,_UnaryOperation,_a(std::vector):”的实例化中:
字表。抄送:75:118:此处为必填项
/usr/include/c++/7/bits/stl_-algo.h:4306:24:错误:调用'(input_a(std::vector)::)(std::pair&)不匹配
*__结果=uuu一元运算(*uuu优先);
~~~~~~~~~~^~~~~~~~~~
wordlist.cc:75:89:注:候选者:输入a(std::vector)::
unt.begin(),wordcount.end(),wordcount.begin(),[&inlist](字符串c){返回计数器(c,inlist);});
^
wordlist.cc:75:89:注意:参数1从'std::pair'到'std::uuCxx11::string{aka std::uuCxx11::basic_string}的转换未知
在本次通话中
transform(wordcount.begin(), wordcount.end(), wordcount.begin(), [&inlist] (string c){return counter(c, inlist);});
您正在尝试更改地图的关键点
也就是说,映射中的对具有类型std::pair
。您不能重新分配这样的对
您所需要的只是以下内容
void input_a( const std::vector<std::string> &inlist )
{
std::map<std::string, int> wordcount;
for ( const auto &item : inlist ) ++wordcount[item];
// ...
}
void输入(const std::vector&inlist)
{
映射字数;
for(const auto&item:inlist)++wordcount[item];
// ...
}
它比多次遍历向量更有效。Lambda应该采用
std::pair
std::map
“由”对组成,这些对通过std::transform
输入Lambda。Lambda是什么?@ohan820如果映射,则不能更改键。Lambda是这只野兽:[&inlist](字符串c){…}
。“我首先使用第一个transform()创建一个映射,然后使用第二个transform()使用函数counter()更改映射中的整数“如果你能一次数数为什么?只是为了使用std::transform
?我认为主要的罪魁祸首不是遍历向量两次,而是在std::map
中对向量中的每个单词进行两次查找。”
void input_a( const std::vector<std::string> &inlist )
{
std::map<std::string, int> wordcount;
for ( const auto &item : inlist ) ++wordcount[item];
// ...
}