C ++中的模板lambda表达式

时间:2019-05-09 13:09:18

标签: c++ c++11 lambda

我正在升级到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)传递值?

1 个答案:

答案 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的结果)调用它们

它将按第一个功能对看到的每个项目进行分类,然后将每个类别中的内容与第二个功能组合在一起。