【发布时间】:2020-04-05 23:47:04
【问题描述】:
我正在尝试使用 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;
}
这是错误代码。错误行在上面的代码中用 cmets 标记。
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 循环。
【问题讨论】: