Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

Передача лямбда в функции - C++

18.06.2012, 11:37. Просмотров 2579. Ответов 8
Метки нет (Все метки)

В чем смысл передачи лямбда выражения функции?
C++
1
2
auto square = [](int x) { return x * x; };
std::cout << square(16) << std::endl;
или
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo
{
public:
    Foo(): _x(5) {}
 
    void doSomething() {
        auto lambda = [this](int x) {
            std::cout << _x * x << std::endl;
        };
 
        lambda(4);
    }
 
private:
    int _x;
};
Не понимаю для чего это придумали и какая от этого польза. Не проще ли определить стандартную ф-цию?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2012, 11:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача лямбда в функции (C++):

Передача переменной в лямбда-функцию по значению - C++
Ребят! А объясните, что тут происходит, позязя :). function&lt;int()&gt; f() { int x = 0; return () mutable {return ++x; }; ...

Лямбда функции - C++
Всем добрый вечер! Пытаюсь ознакомиться поближе с лямбда функциями и уже возникли трудности... Просмотрела пару публикаций на эту тему и...

лямбда как параметр функции - C++
здравствуйте, есть код: template&lt;typename Container, typename...Args&gt; void fafa(Container&amp;&amp; c, std::function&lt;Args...&gt; f) { ...

Назначение mutable в лямбда-функции - C++
Прокомментируйте, чтоб не выдумывать. Спецификатор mutable определяет по списку захвата локальные статические переменные? int main() {...

Изменение содержимого вектора из лямбда функции - C++
Только начал разбираться с лямбда, не могу понять, что нетак сделал. Вот код, std::queue&lt;Pointf&gt; active; Pointf point =...

Использование лямбда выражения в качестве аргумента функции - C++
После того как я познакомился с ламбда функциями я хотел проверить их знания на некой практике, но я столкнулся с тем, что не знаю как...

8
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.06.2012, 11:44 #2
Цитата Сообщение от yuron_477 Посмотреть сообщение
В чем смысл передачи лямбда выражения функции?
передачи куда?
Цитата Сообщение от yuron_477 Посмотреть сообщение
Не проще ли определить стандартную ф-цию?
имея указатель на функцию компилятор не может сделать inline функции в место вызова
0
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.06.2012, 12:10  [ТС] #3
А поподробней обяснить можна. Вот ище один пример из книги (Глава называется "Оболочка лямбда-выражения".)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
  // Wrap the lambda expression to compute the HCF
  function<int(int,int)> hcf = [&](int m, int n) mutable ->int{ if(m < n) return hcf(n,m);
                                     int remainder(m%n);
                                     if(0 == remainder) return n;
                                     return hcf(n, remainder);};
  int a(17719), b(18879);
  cout << "For numbers " << a << " and " << b << " the HCF is " << hcf(a, b) << endl;
  a = 103*53*17*97;
  b = 3*29*103;
  cout << "For numbers " << a << " and " << b << " the HCF is " << hcf(a, b) << endl;
 
   return 0;
}
Сам синтаксис написания кода я понял, просто на етом примере я никак немогу понять истенное назначения етого метода.
Цитата Сообщение от Jupiter Посмотреть сообщение
имея указатель на функцию компилятор не может сделать inline функции в место вызова
Ето что то наподобие аналогии указателя на ф-цию?
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.06.2012, 12:23 #4
Цитата Сообщение от yuron_477 Посмотреть сообщение
Ето что то наподобие аналогии указателя на ф-цию?
нет, лямбда это что-то наподобие функтора, но суть та же самая что и указателя на функцию

Цитата Сообщение от yuron_477 Посмотреть сообщение
просто на етом примере я никак немогу понять истенное назначения етого метода
действительно плохой пример
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
18.06.2012, 18:58 #5
yuron_477, в тех примерах, что вы привели, действительно, использование лямбды бессмысленно. Вот более наглядный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
int main()
{
   std::vector<int> v = {5, 4, 1, 7, 8, 9};
   std::sort(v.begin(), v.end(), [](int a, int b){return a > b;});
   for(auto i : v)
   {
      std::cout << i << '\t';
   }
   std::cout << std::endl;
}
Здесь мы с помощью лямбды отсортировали массив по убыванию.
http://liveworkspace.org/code/90d041af17662599b7f41237f5de29ea

Добавлено через 9 минут
Цитата Сообщение от yuron_477 Посмотреть сообщение
Ето что то наподобие аналогии указателя на ф-цию?
Похоже только тем, что и к функции и к лямбде можно обращаться через скобки ().
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
19.06.2012, 03:32 #6
Цитата Сообщение от yuron_477 Посмотреть сообщение
Не понимаю для чего это придумали и какая от этого польза. Не проще ли определить стандартную ф-цию?
Выглядит иногда лучше чем через ф-циональные объекты.


Кстати в плане эффективности лямбды такие же ф-ции или объекты?
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
19.06.2012, 12:44 #7
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати в плане эффективности лямбды такие же ф-ции или объекты
На сколько я знаю, компилятор воспринимает лямбда-функцию как объект класса, наследованного от std::function со всеми последствиями.
1
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
19.06.2012, 15:59 #8
А std::function это то что было раньше в boost как я понимаю?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.06.2012, 16:12 #9
Avazart, boost::function и сейчас есть в бусте, но да, сделано на основе.

Добавлено через 11 минут
gooseim, Если и унаследованного, то явно не public наследованием. По крайней мере в gcc.
0
19.06.2012, 16:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2012, 16:12
Привет! Вот еще темы с ответами:

Локальное лямбда-выражение не допускается в функции-члене класса управляемый - C++
Здравствуйте, мне хотелось бы распараллелить алгоритм с помощью parallel_invoke, чтобы ускорить вычисления, Concurrency::parallel_invoke...

Передача объектов функции. Два обращения к функции деструктора - C++
В книге этот код должен 2 раза обращаться к функции деструктора, то есть результатом программы должно быть: Создание 10 Разрушение ...

Передача функции в качестве параметра функции - C++
Дорогие форумчане! Повторяю пример из книжки. До конца не понял его! Помогите разобраться! Тема: односвязный линейный список. Плюс,...

Лямбда функции - C++
Помогите пожалуйста. Написать программу демонстрирующую лямбда функцию на с++. желательно с комментариями, а то я в этом совсем ничего не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.