我正在升级到C ++ 11,并且对https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp?view=vs-2019中提到的lambda表达式有基本的了解。
对于以下从http://project-thrill.org/捕获的代码,我有以下疑问:
以下程序计算文本中每个唯一单词的出现次数
void WordCount(thrill::Context& ctx, std::string input, std::string output)
{
using Pair = std::pair<std::string, size_t>;
auto word_pairs = ReadLines(ctx, input)
.template FlatMap<Pair>(
// flatmap lambda: split and emit each word
[](const std::string& line, auto emit)
{
Split(line, ’ ’, [&](std::string_view sv)
{
emit(Pair(sv.to_string(), 1));
});
});
word_pairs.ReduceByKey(
// key extractor: the word string
[](const Pair& p) { return p.first; },
// commutative reduction: add counters
[](const Pair& a, const Pair& b)
{
return Pair(a.first, a.second + b.second);
})
.Map([](const Pair& p)
{
return p.first + ": " + std::to_string(p.second);
}).WriteLines(output);
}
第一个问题是
.template FlatMap
FlatMap
是在返回ReadLines
时运行的模板类型lambda函数吗?
在
FlatMap<Pair>
内部,该值如何传递给(const std::string& line, auto emit)
,以及谁传递该值?
在
ReduceByKey
函数内部,如何对lambda函数的参数[](const Pair& p)
传递值?
答案 0 :(得分:2)
是什么
.template FlatMap
在语法上有必要表明FlatMap
是模板成员,并且<
是显式模板参数的一部分,而不是比较运算符。
FlatMap
是在返回ReadLines
时运行的模板类型lambda函数吗?
那不是问题。 FlatMap
是模板成员函数,它收到一个Callable作为唯一参数。在这里使用lambda表达式进行调用。
在
FlatMap<Pair>
内部,该值如何传递给(const std::string& line, auto emit)
,以及谁传递该值?
FlatMap
的正文。就像在lambda中如何调用emit
一样。大概对输入中的每一行调用一次,并从每条输入行生成多个对作为输出。
在
ReduceByKey
函数内部,如何对lambda函数的参数[](const Pair& p)
传递值?
以同样的方式。 ReduceByKey
有两个 Callable 参数,并根据word_pairs
的成员(这是FlatMap
的结果)调用它们
它将按第一个功能对看到的每个项目进行分类,然后将每个类别中的内容与第二个功能组合在一起。