Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算一个单词在映射中出现的次数-使用transform()-调用不匹配_C++_Algorithm_Dictionary_Vector_Word - Fatal编程技术网

C++ 计算一个单词在映射中出现的次数-使用transform()-调用不匹配

C++ 计算一个单词在映射中出现的次数-使用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)

我试图计算一个单词在地图上存在的次数。然后,映射应该包含作为字符串的单词以及作为int存在的次数。inlist是包含所有单词的向量。我首先使用第一个transform()创建一个映射,然后使用第二个transform()使用函数counter()更改映射中的int

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];
    // ...
}