C ++ лямбда-выражение - PullRequest
       2

C ++ лямбда-выражение

3 голосов
/ 25 марта 2011

Я пытаюсь понять лямбда-выражение.

Это происходит над моей головой.Нужны поясняющие примеры

Пожалуйста!

Ответы [ 4 ]

4 голосов
/ 25 марта 2011

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

vector<int> v = {50, -10, 20, -30};

std::sort(v.begin(), v.end());  // the default sort
// now v should be { -30, -10, 20, 50 }

// sort by absolute value:
std::sort(v.begin(), v.end(), [](int a, int b) { return abs(a)<abs(b); });
// now v should be { -10, 20, -30, 50 }

Аргумент [&](int a, int b) { return abs(a)<abs(b); } является «лямбда-выражением» (или «лямбда-функцией» или «лямбда-выражением»), который задает операцию, которая дает два целочисленных аргумента a и b, возвращает результатсравнения их абсолютных значений.

[&] - это «список захвата», указывающий, что используемые локальные имена будут переданы по ссылке.Мы могли бы сказать, что хотим «захватить» только v, мы могли бы сказать так: [& v].Если бы мы хотели передать v по значению, мы могли бы сказать так: [= v].Захватить все - это [], захватить все по ссылкам - [&], а захватить все по значению - [=].

http://www2.research.att.com/~bs/C++0xFAQ.html#lambda

4 голосов
/ 25 марта 2011

Если вы знакомы с текущими функторами C ++ (т. Е. С классами, которые реализуют operator(), так что их можно вызывать как функции, но есть внутренние члены-данные, которые можно инициализировать), тогда в основном лямбда-выражения являются хорошим расширениемк этой функции языка, позволяя вам создавать функторы, а также инициализировать их в точке, где они будут вызываться, вместо того, чтобы определять классы функторов.Лямбды также достаточно гибки, поскольку они могут быть замыканиями, позволяя вам «захватывать» значения любых переменных в текущей области.

Мне показалось, что это был действительно замечательный ресурс в блоге группы разработчиков Visual C ++, который прошел черезмногие из этих функций: Lambdas, auto и static_assert: C ++ 0x Особенности в VC10, часть 1

Надеюсь, это поможет,

Джейсон

3 голосов
/ 25 марта 2011

Лямбда-выражение (также известное как лямбда-функция) - это безымянная функция, определенная в месте вызова.

Например, посетите Примеры лямбда-выражений

Лучшие места для изучения:

2 голосов
/ 25 марта 2011

Также еще один пример, если вы хотите:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    // Initialization C++0x-style
    vector<int> voo = { 1, 2, 3, 4, 5 };

    // Lambda is here
    auto print = [&](int& i) { cout << i << endl; } ;

    // Check that out, no loop !
    for_each(voo.begin(), voo.end(), print);

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