Сколько параметров должно быть передано в C ++ Lambda? - PullRequest
0 голосов
/ 21 января 2019

Я действительно новичок в c ++ 11, поэтому, понимая выражение lamda, я полон сомнений.Я не могу понять, сколько параметров должно быть передано в выражение lamda.

подобно

vector<int> v {4, 1, 3, 5, 2, 3, 1, 7};
vector<int>:: iterator p = find_if(v.begin(), v.end(), [](int i) 
    { 
        return i > 4; 
    });

здесь только 1 аргумент передается в функцию lamda.и каково значение i и откуда оно передается lamda.

Но в приведенном ниже случае 2 аргумента передаются

sort(v.begin(), v.end(), [](const int& a, const int& b) -> bool
    { 
        return a > b; 
    });

, откуда эти два значения передаются в лямдуПожалуйста, объясните, пожалуйста, проясните мои сомнения

1 Ответ

0 голосов
/ 21 января 2019

Каждый алгоритм стандартной библиотеки, который требует один или несколько предикатов, имеет особые требования для данных предикатов.Если вы посмотрите на std::find_if:

template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );

Требования унарного предиката p таковы:

p - унарный предикат, которыйвозвращает true для требуемого элемента.

Выражение p(v) должно быть преобразовано в bool для каждого аргумента v типа (возможно, const) VT, где VT - этотип значения InputIt, независимо от категории значения, и не должен изменять v.[...]

Это означает, что тип UnaryPredicate должен предоставлять оператор вызова, аналогичный (в вашем случае):

bool operator()(int const&) const;

Лямбда - это простоэкземпляр типа замыкания с перегруженным оператором вызова, чьи типы возврата и аргумента выводятся из лямбда-выражения.Это объявление:

auto lambda = [](int i) { return i > 4; };

... аналогично следующему с использованием анонимного типа:

struct {
    bool operator()(int i) const { retuirn i > 4; }
} lambda;

И, как вы можете видеть, operator() этого анонимного типа является действительнымотносительно требования std::find_if, поэтому здесь можно использовать лямбду.

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