шаблон лямбда-выражения в C ++ - PullRequest
1 голос
/ 09 мая 2019

Я обновляюсь до C ++ 11 и имею базовое представление о лямбда-выражении, как упомянуто в https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp?view=vs-2019

У меня следующие сомнения по поводу кода ниже, захваченного из 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?

внутри FlatMap<Pair> как значение передается (const std::string& line, auto emit) и кто передает значение?


внутри ReduceByKey функции, как аргумент [](const Pair& p) лямбда-функции, как значение передается?

1 Ответ

2 голосов
/ 09 мая 2019

что такое .template FlatMap

Синтаксическая необходимость - указывать, что FlatMap является членом шаблона и что < является частью явного аргумента шаблона, а не оператором сравнения.

- это FlatMap лямбда-функция типа шаблона, которая работает при возврате ReadLines? `

Это не вещь. FlatMap - это функция-член шаблона, и она получает Callable в качестве единственного параметра. Здесь это называется лямбда-выражением.

внутри FlatMap<Pair> как значение передается (const std::string& line, auto emit) и кто передает значение?

Тело FlatMap. например, как emit называется внутри лямбды. Предположительно, он вызывается один раз для каждой строки на входе и генерирует несколько пар в качестве выходных данных для каждой строки ввода.

внутри ReduceByKey функции, как аргумент [](const Pair& p) лямбда-функции, как значение передается?

Точно так же. ReduceByKey имеет два Callable аргумента и вызывает их на основе члена word_pairs (что является результатом FlatMap)

Он классифицирует каждый элемент, который видит по первой функции, а затем объединяет в каждой категории со второй функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...