Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35

Лямбда функции

04.12.2015, 17:19. Показов 4434. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый вечер!
Пытаюсь ознакомиться поближе с лямбда функциями и уже возникли трудности... Просмотрела пару публикаций на эту тему и попробовала написать простой код.
Но проблема с тем, что компилятор не может запушить в вектор лямбда функцию... Но ведь она должна вернуть интовое значение. Что не так я делаю?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    srand(time(NULL));
 
    std::vector<int> srcVec;
    
    srcVec.push_back([]
    {
        int temp = rand()%30; 
        if (temp % 2 == 0) 
            return temp; 
        else return 0;
    });
 
    return EXIT_SUCCESS;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2015, 17:19
Ответы с готовыми решениями:

Передача лямбда в функции
В чем смысл передачи лямбда выражения функции?auto square = (int x) { return x * x; }; std::cout &lt;&lt; square(16) &lt;&lt;...

Функции и Лямбда выражения
Доброго времени суток, дорогие форумчане! Всплыл вопрос: &quot;Вот хочу сделать функцию и передавать ей как аргумент какое-то условие допустим...

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

26
2393 / 1921 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
04.12.2015, 17:21
Лямбда-функции используются там, где требуется какая-то вызываемая сущность: функц.объект, указатель на функцию и т.д. А push_back принимает на вход int в данном случае.
1
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
04.12.2015, 17:25
Лучший ответ Сообщение было отмечено Тамика как решение

Решение

Цитата Сообщение от Тамика Посмотреть сообщение
Что не так я делаю
не вызываешь функцию

код исключительно демонстрационный:
http://ideone.com/z7lxWd

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    #include <iostream>
    #include <vector>
     
    int main()
    {
        srand(time(NULL));
        std::vector<int> srcVec;
     
        srcVec.push_back([]
        {
            int temp = rand()%30; 
            if (temp % 2 == 0) 
                return temp; 
            else return 0;
        }());
        std::cout<<srcVec[0]<<std::endl;
        return EXIT_SUCCESS;
    }
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
04.12.2015, 17:25
Лучший ответ Сообщение было отмечено Тамика как решение

Решение

Тамика, и еще ко-что
C++
1
2
3
4
5
6
7
[]
    {
        int temp = rand()%30; 
        if (temp % 2 == 0) 
            return temp; 
        else return 0;
    }
у лямбды, как у функции должен быть список параметров.[внешние переменные](список параметров){тело}не, что-то не то, не должен быть
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.12.2015, 17:27
Лучший ответ Сообщение было отмечено Тамика как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <ctime>
#include <vector>
using namespace std;
 
class Lamda
{
public:
   bool operator()()
   {
      int temp = rand() % 30;
      if(temp % 2 == 0)
         return temp;
      else return 0;
   }
};
int main()
{
   srand( time( NULL ) );
   std::vector<int> srcVec;
 
   // инициализация обоих функтором
   // безимянный функтор
   auto lamda1 = [] {
      int temp = rand() % 30;
      if(temp % 2 == 0)
         return temp;
      else return 0;
   };
   // функтор типа Lamda
   Lamda lamda2;
 
   // их вызовы
   for(int i = 0; i < 10; i++)
    srcVec.push_back( lamda1() );
 
   for(int i = 0; i < 10; i++)
      srcVec.push_back( lamda2() );
 
   return 0;
}
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
04.12.2015, 17:29
зачем ты в вектор интов пихаешь функцию? у тебя что, вектор функций?
ты хотел значение функции запихнуть? написал бы
C++
1
2
3
4
5
6
7
8
srcVec.push_back([]() -> int
    {
        int temp = rand()%30; 
        if (temp % 2 == 0) 
            return temp; 
        else return 0;
    }()
        );
Добавлено через 57 секунд
rikimaru2013, он не создавал промежуточных переменных в оригинале
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.12.2015, 17:30
Цитата Сообщение от Тамика Посмотреть сообщение
и попробовала написать
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
написал бы
кажись там она
0
04.12.2015, 17:32

Не по теме:

rikimaru2013, где там? В интернете? Ты долбанулся конкретно? Баб в интернете нет и быть не может, да и не место им тут!

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.12.2015, 17:33
Вот, что ты запихивала в вектор до этого - предикат -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <ctime>
#include <vector>
#include <functional>
using namespace std;
 
 
int main()
{
   srand( time( NULL ) );
 
   typedef std::function<bool()> MyFunctor;
   std::vector<MyFunctor> srcVec;   
 
  
   for(int i = 0; i < 5; i++)
      srcVec.push_back( [] { cout << "Hello" << endl;   return 0; } );
 
   // их вызовы 
   for(int i = 0; i < 5; i++)
      srcVec[i]();
 
   return 0;
}
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
04.12.2015, 17:34  [ТС]
S_el, спасибо! Теперь всё хорошо.

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
у лямбды, как у функции должен быть список параметров.[внешние переменные](список параметров){тело}
А я читала, что это вроде не обязательно... Или я не права?

rikimaru2013, спасибо за такой вариант!

А можете ещё объяснить, если не сложно, что такое lambda-introducer? Интуитивно понимаю, но этого явно недостаточно... К примеру, в этом же коде, верно ли я использовала?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    srand(time(NULL));
 
    std::vector<int> srcVec;
    int val = 2;
    srcVec.push_back([val]
    {
        int temp = rand()%30; 
        if (temp % val == 0) 
            return temp; 
        else return 0;
    }());
     std::cout<<srcVec[0]<<std::endl;
    return EXIT_SUCCESS;
}
Добавлено через 50 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
rikimaru2013, где там? В интернете? Ты долбанулся конкретно? Баб в интернете нет и быть не может, да и не место им тут!
Вообще-то "она", да.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.12.2015, 17:38
Цитата Сообщение от Тамика Посмотреть сообщение
А я читала
Цитата Сообщение от Тамика Посмотреть сообщение
что такое lambda-introducer
Страно) Про что вы читали, если это одно и тоже.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <ctime>
#include <vector>
#include <functional>
using namespace std;
 
 
int main()
{
   srand( time( NULL ) );
 
   int x = 0;
 
 
   auto lamda = [&x](  ) {
         // захватили х по ссылке
      ++x;
   };
 
 
   lamda();
   lamda();
   lamda();
 
   cout << x << endl;
 
   return 0;
}
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
04.12.2015, 17:39
Тамика, правда "она"? Чем докажешь? Пошли бухать!
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
04.12.2015, 17:40  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Страно) Про что вы читали, если это одно и тоже.
Да я открыла первое, что попало. Попробовала. Не вышло. И сразу к Вам сюда. На хабре статейка подвернулась и на оверфлоу.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
04.12.2015, 17:41
Цитата Сообщение от Тамика Посмотреть сообщение
А я читала, что это вроде не обязательно
обязательно.

Цитата Сообщение от Тамика Посмотреть сообщение
lambda-introducer?
Из перевода книги Хортона:
Предваряющие квадратные скобки называются лямбда-интродуктором, поскольку они
отмечают начало лямбда-выражения.
...
Лямбда-интродуктор может содержать директиву фиксации (capture clause), которая
определяет, как тело лямбда-выражения может обращаться к переменным в окружаю*
щей области видимости.
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
04.12.2015, 17:43  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Тамика, правда "она"? Чем докажешь? Пошли бухать!
Это типо тест? Если отвечу, что "го", значит я мужик? Или как? Какой чит-код сюда?

Добавлено через 2 минуты
S_el, я имела в виду, что не обязательно чем-то заполнять.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.12.2015, 17:47
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
 
 
int main()
{
   std::vector<int> arr = {4,7,2,9, 1, 19, 31, 5};
   int min = 3;
   int max = 10;
   int count = 0;
 
   std::for_each( arr.begin(), arr.end(), [min, max, &count]( const int curr) {
      if(curr >= min && curr <= max)
      {
         // max, min по значениею
         // count - по ссылке
         cout << "Number " << curr << endl;
         count++;
      }
   });
   cout << "Was founded " << count << endl;
   cout << endl;
}
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
04.12.2015, 17:50  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
if(curr >= min && curr <= max)
curr - это будет элемент вектора arr?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.12.2015, 17:53
Тоже решение только с функтором (чтобы вы увидели, что лямда по большому счёту внёс удобство и 10% др плючек, а так это можно было реализовать и до С++ 11)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
 
class FoundNumber
{
private:
   int _min;
   int _max;
   int& _counter;
 
public:
   FoundNumber( const int min, const int max, int& counter ) :
      _min( min )
      , _max( max )
      , _counter( counter )
   {
 
   }
   void operator()( const int curr )
   {
      if(curr >= _min && curr <= _max)
      {
         cout << "Number " << curr << endl;
         _counter++;
      }
   }
};
int main()
{
   std::vector<int> arr = {4,7,2,9, 1, 19, 31, 5};
   int min = 3;
   int max = 10;
   int count = 0;
 
   FoundNumber functor( min, max, count );
   std::for_each( arr.begin(), arr.end(), functor );
 
 
   cout << "Was founded " << count << endl;
   cout << endl;
}
Добавлено через 2 минуты
Цитата Сообщение от Тамика Посмотреть сообщение
curr - это будет элемент вектора arr?
В качестве 3 параметра std::for_each http://www.cplusplus.com/refer... /for_each/

C++
1
2
template <class InputIterator, class Function>
   Function for_each (InputIterator first, InputIterator last, Function fn);
внутри кода будет обычный вызов fn(current_element)
C++
1
2
3
4
5
6
7
8
        // TEMPLATE FUNCTION for_each
template<class _InIt,
    class _Fn1> inline
    void _For_each(_InIt _First, _InIt _Last, _Fn1& _Func)
    {   // perform function for each element
    for (; _First != _Last; ++_First)
        _Func(*_First);
    }

Следовательно fn может быть всё, что угодно у которого есть перегрузка оператора круглые скобки.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
04.12.2015, 17:57
Цитата Сообщение от Тамика Посмотреть сообщение
Тамика, правда "она"? Чем докажешь? Пошли бухать!
Это типо тест? Если отвечу, что "го", значит я мужик? Или как? Какой чит-код сюда?
я мог бы сказать "покажи сиське", но решил проявить культуру. И нет, вне зависимости от того, мужик ты или баба, сходить побухать никогда не помешает.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
04.12.2015, 18:37
Цитата Сообщение от Тамика Посмотреть сообщение
А я читала, что это вроде не обязательно...
Уже поправился.

Не по теме:

Я иногда чушь порю, а она иногда тихо повизгивает... Так и живем...:)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2015, 18:37
Помогаю со студенческими работами здесь

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

Время жизни лямбда-функции
A lambda might outlive its caller/ This can happen if we pass a lambda to a different thread or the callee stores away the lambda for...

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

Захват всех значений в лямбда функции
Привет. Был вопрос на собеседовании &quot;как сделать лямбда функцию так, чтобы список захвата мог принять любое значение&quot;? Ну или...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru