首页 > 解决方案 > 调用不匹配...... lambda 函数和 for_each() 出现一些错误

问题描述

我正在尝试使用 for_each() 来运行一个函数 print_a(),它需要一个字符串和一个 int。该函数应该打印字符串并仅使用 int 进行格式化。int 是从一个名为longestword() 的函数中获取的,该函数返回映射中最长单词的长度。

这是包含第一个 for_each 的函数

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

    transform(inlist.begin(), inlist.end(), inserter(wordcount, wordcount.end()), [inlist] (string c){return counter(c, inlist);});
    int longest = longestword(wordcount);
    for_each(wordcount.begin(), wordcount.end(),[longest](pair <string, int> p) {print_a(p,longest);});
}

这是函数longestword();

int longestword(map<string, int> list)
{
    int n{1};
    for_each(list.begin(), list.end(),[&n](string s){                %ROW 71
        if (s.length()>n)
        {
            n = s.length();
        }
    });               %ROW 76
    return n;
}

这是函数 print_a()

void print_a(pair <string, int> entry, int i)
{
    cout << setfill(' ') << right  << entry.first  <<  setw(i) <<  entry.second << endl;
}

这是错误代码。错误行在上面的代码中用注释标记。

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 ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, int> >; _Funct = longestword(std::map<std::__cxx11::basic_string<char>, int>)::<lambda(std::__cxx11::string)>]’:
wordlist.cc:76:6:   required from here
/usr/include/c++/7/bits/stl_algo.h:3884:5: error: no match for call to ‘(longestword(std::map<std::__cxx11::basic_string<char>, int>)::<lambda(std::__cxx11::string)>) (std::pair<const std::__cxx11::basic_string<char>, int>&)’
  __f(*__first);
  ~~~^~~~~~~~~~
wordlist.cc:71:52: note: candidate: longestword(std::map<std::__cxx11::basic_string<char>, int>)::<lambda(std::__cxx11::string)>
     for_each(list.begin(), list.end(),[&n](string s){
                                                    ^
wordlist.cc:71:52: 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>}’


旁注:这是一项学校作业,我们不允许使用常规的 for- 或 while 循环。

标签: for-looplambdaiterator

解决方案


通过将向量发送到最长字()而不是地图来解决问题


推荐阅读