Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
UltraPenguin
228 / 94 / 22
Регистрация: 20.03.2014
Сообщений: 301
Завершенные тесты: 1
#1

В чем плюсы лямбд? - C++

06.10.2015, 13:13. Просмотров 1108. Ответов 47
Метки нет (Все метки)

В чем очевидные и/или измеряемые плюсы лямбд в C++? Повышает ли это скорость кода? Или памяти меньше? Или еще что-то? Ну кроме повышения ЧСВ и того что это стильно-модно-молодежно? Слышал еще, что знание лямбд позволяет подкатывать к девушкам (типа "Детка, пойдем ко мне? Покажу тебе свои лямбда-исчисления А затем мы апплицируем одну интересную лямбда-абстракцию под номером 69 которую я только что выучил"), но сам не проверял. Какие у кого мысли по этому поводу?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2015, 13:13     В чем плюсы лямбд?
Посмотрите здесь:

Использование лямбд - C++
Допустим есть 2 класса A и B, из B нужно вызывать некоторые методы из А, допустим таких методов немного 2-3 не более, а то и во все 1. ...

Верно ли такое использование лямбд - C++
Доброй ночи. Есть функция: void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata=0 ) На вход она принимает...

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

Игродел на C++ плюсы и минусы - C++
Всем добрый день У меня к вам вопрос такой вот я сейчас учу C++ и хотел бы пойти работать за границу Game-developerom когда закончу в...

Плюсы среды Visual Studio 2013 - C++
Я понимаю, что слегка не по теме.., НО.. курсовую написал на C++ и именно в VS 2013. Почему? Потому что такая привычка. Привык к этой...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,883
Записей в блоге: 2
06.10.2015, 16:47     В чем плюсы лямбд? #21

Не по теме:

gru74ik, ну у меня же не ЧСВ, как у иных его обладателей, которые и мне его приписывают



А вопрос первоклассности и возможных других ограничений действительно стоит раскрыть (имхо, опять же), а не просто писать
Цитата Сообщение от DrOffset Посмотреть сообщение
лямбды нужны там, где нужны локальные функции. все.
Остальное - это ненужная философия.
gru74ik
Модератор
Эксперт CЭксперт С++
3981 / 1728 / 193
Регистрация: 20.02.2013
Сообщений: 4,829
Записей в блоге: 21
06.10.2015, 16:55     В чем плюсы лямбд? #22
_Ivana, вот:
В C и C++ нельзя создавать функции во время выполнения программы, поэтому функции не являются объектами первого класса в этих языках. В то же время указатели на функцию можно передавать в качестве аргумента и возвращать из другой функции, поэтому иногда функции в C++ называют объектами второго класса (англ. second-class object). Тем не менее, в C++ есть понятие функционального объекта (англ. function object), который является объектом первого класса и реализует эквивалентную функциям семантику.
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,883
Записей в блоге: 2
06.10.2015, 17:15     В чем плюсы лямбд? #23
gru74ik, хорошо, признаю что лохЪ Хотя я в своих (так задевающих ЧВС иных участников) примерах использовал это, передавал-возвращал-создавал-связывал-захватывал по ссылке/значению и т.п. Но все равно у меня устойчивое ощущение наличия ограничений, которых нет в настоящих лямбда-языках. Из-за этого и провокационная фраза про "жалкое подобие". Я могу спросить у спецов, что они скажут на этот счет. Т.к. здесь спецы только пишут что "остальное-это философия", да "Лол-вау". Я не стал этого делать до того как писать на форум, чтобы моя дурь видна была, а не выступать попугаем и транслятором чужих мыслей.
gru74ik
Модератор
Эксперт CЭксперт С++
3981 / 1728 / 193
Регистрация: 20.02.2013
Сообщений: 4,829
Записей в блоге: 21
06.10.2015, 17:31     В чем плюсы лямбд? #24
Цитата Сообщение от _Ivana Посмотреть сообщение
выступать попугаем и транслятором чужих мыслей
Это в мой огород самосвал, да?
DrOffset
6914 / 4107 / 936
Регистрация: 30.01.2014
Сообщений: 6,906
06.10.2015, 18:25     В чем плюсы лямбд? #25

Не по теме:


_Ivana, может тебе велосипед купить? Ты чего такой вредный?


Цитата Сообщение от _Ivana Посмотреть сообщение
Т.к. здесь спецы только пишут что "остальное-это философия"
Я вообще-то ответил по теме. В контексте С++. Почитай хоть пропозалы на лямбды, идея эта основная и она сквозит.
А философией я назвал инсинуации на тему "стильно-модно-молодежно" и чего-то там про ЧСВ.

Про ФП речи вообще не было. Автор про сравнение с ФП не спрашивал.
Так что претензия не засчитана, по крайней мере ко мне.
Быть инициатором превращения этой темы в филиал СВ лично я не собирался.
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,883
Записей в блоге: 2
06.10.2015, 18:34     В чем плюсы лямбд? #26

Не по теме:

gru74ik, не, когда писал, даже не думал А сейчас вижу, забавно получилось Но никого не имел в виду.



Не по теме:

DrOffset, спасибо, велосипедов я и сам понаделаю - только подскажите с инструментами: с теми же лямбдами, например


А насчет остального... У каждого свой интерес, про других говорить не буду (ибо могут обидеться ), но лично я хотел с помощью этой темы больше разобраться в возможностях лямбд в С++, и сравнительно с ФП тоже. Ну нет так нет, буду разбираться в другом месте

DrOffset, спасибо за пропозалы.
DrOffset
6914 / 4107 / 936
Регистрация: 30.01.2014
Сообщений: 6,906
06.10.2015, 18:50     В чем плюсы лямбд? #27
Цитата Сообщение от _Ivana Посмотреть сообщение
Ну нет так нет, буду разбираться в другом месте
Создал бы тему.

Вообще, почти все ответы есть по ссылке выше.
Лямбды создавались в первую очередь для удобства. Никаких принципиально новых задач они не решают. Все, что сейчас делается с ними, раньше можно было сделать и без них, но костыльными методами. Сравни:
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>
 
void (*p)(int);
 
void foo()
{
    p = [](int) { std::cout << "hello\n"; };
};
 
void boo()
{
    struct Local {
        static void local_(int)
        {
            std::cout << "hello2\n";
        }
    };
    p = &Local::local_;
}
 
int main()
{
    foo();
    p(10);
    
    boo();
    p(10);
}
Так что проводить прямую параллель с ФЯ, я думаю, здесь не нужно. Более того - опасно. Т.к. может ввести в заблуждение.
Тем не менее, у меня нет никаких оснований думать, что в рамках правил установленных в С++, лямбды чем-то ограничены. Т.е. они умеют все то, что умеют обычные функторы (и даже чуть больше), но удобнее (по задумке).
Про сравнение с ФЯ меня спрашивать вряд ли нужно. Т.к. я на ФЯ не пишу, не писал, и писать, вероятнее всего, не буду. А судить о темах, в которых я разбираюсь поверхностно, не имею привычки.
UltraPenguin
228 / 94 / 22
Регистрация: 20.03.2014
Сообщений: 301
Завершенные тесты: 1
06.10.2015, 19:04  [ТС]     В чем плюсы лямбд? #28
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вы задали вопрос, вам ответили, а вы тут же даете совет, что это не так)
Я не давал совет. Просто не согласен конкретно с этим равенством.

Спасибо всем за ответы! Я в своем пока не очень большом опыте еще не сталкивался с ситуацией, где нужны были бы локальные функции и без них никак. Может кто-нибудь привести реальный пример, где лямбды обязательны или экономят полотно кода?
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
06.10.2015, 19:10     В чем плюсы лямбд? #29
UltraPenguin, посмотри на 1 пост выше своего последнего и еще раз это скажи.
Цитата Сообщение от UltraPenguin Посмотреть сообщение
Просто не согласен конкретно с этим равенством
Добавлено через 2 минуты
нету того, когда они обязательны. Они просто дополнение к существующему. Своеобразная параллель. В STL, например, в алгоритмах немного проще писать лямбды (когда они небольшие) чем описывать предикаты, как отдельные функции.
UltraPenguin
228 / 94 / 22
Регистрация: 20.03.2014
Сообщений: 301
Завершенные тесты: 1
06.10.2015, 19:18  [ТС]     В чем плюсы лямбд? #30
daslex, смысл на него смотреть если пример образовательный? В реальном коде все может быть гораздо читабельнее за счет названий функции и структуры например. Да и само по себе вполне читаемо. В одном случае одна строка, в другом две (утрировано, если объявление взять за 1).

Поэтому и попросил реальный пример.

Добавлено через 4 минуты
А вообще кто-нибудь пробовал замерить скорость выполнения кода с лямбдами и без?
DrOffset
6914 / 4107 / 936
Регистрация: 30.01.2014
Сообщений: 6,906
06.10.2015, 19:31     В чем плюсы лямбд? #31
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от UltraPenguin Посмотреть сообщение
Может кто-нибудь привести реальный пример, где лямбды обязательны или экономят полотно кода?
Опять же, выше была ссылка и там достаточно примеров.
Хоть и синтаксис лямбд сейчас немного не такой, как в том предложении, но суть должна быть понятна.
А так, можно элементарный пример привести с контейнерами\алгоритмами std. Когда нужен предикат, или трансформирующая функция, но вынесение этой сущности вовне либо сломает инкапсуляцию, либо повредит дизайну, либо банально окажется слишком многословной.
Можно себе представить и более длинные примеры, какой-нибудь регистратор реакции на события, или, скажем, пул потоков, который выполняет лямбду, которая генерируется шаблоном.

Добавлено через 1 минуту
Цитата Сообщение от UltraPenguin Посмотреть сообщение
А вообще кто-нибудь пробовал замерить скорость выполнения кода с лямбдами и без?
Лямбды отлично встраиваются.
Замерять не надо, нужно просто посмотреть ассемблер.

Добавлено через 4 минуты
UltraPenguin, вот, кстати, реальное удобство, после поддержки шаблонных коннектов в Qt: https://wiki.qt.io/New_Signal_Slot_Syntax
См. там пример с лямбдой.
Раньше вот пришлось бы целый слот заводить, который, мало того, что класс загаживает, так еще только и занимался бы, что прокидыванием вызова. А так - просто и понятно, и по файлу скакать не надо, в поисках определения
UltraPenguin
228 / 94 / 22
Регистрация: 20.03.2014
Сообщений: 301
Завершенные тесты: 1
06.10.2015, 19:33  [ТС]     В чем плюсы лямбд? #32
DrOffset, за последний пример особенно спасибо! Будем вкуривать-встраивать))
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
06.10.2015, 19:51     В чем плюсы лямбд? #33
DrOffset, использование в алгоритмах, оборачивание однострочных действий, условий в лямбду - ОК.
Но нафига намеренно заменять приятный глазу цикл от 0 до n, на какую-нибудь рекурсивную лямбду? Специально, чтобы сказать "смотрите, без меня вы не разберёте, что тут написано!"
C++
1
auto gi = [a,n](int w, int i, const auto& la) -> int { return i==n || a[i]>w ? i-1 : la(w,i+1,la);};
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1
06.10.2015, 21:20     В чем плюсы лямбд? #34
Цитата Сообщение от _Ivana Посмотреть сообщение
gru74ik, которые граждане первого класса.
Цитата Сообщение от gru74ik Посмотреть сообщение
_Ivana, а разве функциональные объекты в С++ не являются объектами первого класса?
Цитата Сообщение от _Ivana Посмотреть сообщение
если да - тогда я признаю что лохЪ
http://rextester.com/QSDB16731

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
auto foo(auto f) -> decltype(f)
{
    f();
    return f;
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    const auto citizen1 = [](){ std::cout<<"ждём ваших признаний!\n"; };
    
    const auto citizen2 = citizen1;
 
    const auto citizen3 = foo( citizen2 );
    
    citizen3();
    citizen3();
}
Добавлено через 2 минуты
Цитата Сообщение от gru74ik Посмотреть сообщение
и именно поэтому их если и передают в качестве параметра, то только как указатель на функцию.
http://rextester.com/AIDIUM4741


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>
 
void foo( void bar() )
{
    bar();
 
}
 
void bar()
{
    std::cout<<
        "и именно поэтому их если и передают в качестве параметра, "
        "то только как указатель на функцию.\n\n"
    
        "да неужели?\n";
}
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    foo(bar);
}
gru74ik
Модератор
Эксперт CЭксперт С++
3981 / 1728 / 193
Регистрация: 20.02.2013
Сообщений: 4,829
Записей в блоге: 21
06.10.2015, 21:26     В чем плюсы лямбд? #35
hoggy, хмм... То есть, функция может принимать в качестве аргумента не только указатель на функцию, но и просто другую функцию?
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
06.10.2015, 21:33     В чем плюсы лямбд? #36
Во втором примере она принимает всего-лишь адрес функции, а не функцию как объект. А потом уже вызывается. Тот же самый указатель.

Добавлено через 2 минуты
Если не так, пусть поправят. Вот я сейчас так вижу. Не иначе. А первый, не знаю просто.
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1
06.10.2015, 21:41     В чем плюсы лямбд? #37
Цитата Сообщение от gru74ik Посмотреть сообщение
не только указатель на функцию, но и просто другую функцию?
в этом отношении они похожи на массивы:
могут неявно каститься к типу "указатель на функцию"

если вас не устраивает указатель на функцию,
можно поиметь ссылку на функцию.

Добавлено через 2 минуты
Цитата Сообщение от daslex Посмотреть сообщение
Тот же самый указатель.
все верно.
C++
1
void foo( void bar() ) //<--- bar указатель на функцию
это просто альтернативная запись

тем не менее, в качестве аргумента выступала функция-объект.

и можно принимать её по ссылке:

http://rextester.com/FWPC18702

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
void foo( void (&bar)() )
{
    bar();
 
    if( std::is_reference<decltype(bar)>::value )
        std::cout <<" bar - это ссылка\n";
}
 
void bar()
{
    std::cout << "Hello, world!\n";
}
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    foo(bar);
}
а ссылку можно срисовать только с объекта.
gru74ik
Модератор
Эксперт CЭксперт С++
3981 / 1728 / 193
Регистрация: 20.02.2013
Сообщений: 4,829
Записей в блоге: 21
06.10.2015, 21:42     В чем плюсы лямбд? #38
UltraPenguin, _Ivana, кстати, вот хорошая статья по сабжу.
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,883
Записей в блоге: 2
06.10.2015, 23:01     В чем плюсы лямбд? #39
Цитата Сообщение от hoggy Посмотреть сообщение
"ждём ваших признаний!\n"
так были уже:
Цитата Сообщение от _Ivana Посмотреть сообщение
хорошо, признаю что лохЪ
но если вам приятно это слышать ((С) из анекдота про "КГБ сгорело"), то еще раз: признаю, что я лохЪ.

ЗЫ самое забавное, что я читал что они "являются объектами первого класса", и даже сам это использовал вовсю - примеры можете найти в недавних моих постах кода в этом разделе форума. Но повторюсь, что меня не покидает смутное ощущение их ограниченности по сравнению с полноценными лямбда-языками, которое может проистекать из-за моего незнания именно плюсовых лямбд. Основано оно на опыте попыток прямой трансляции функциональных алгоритмов и подхода из ФЯ в С++ через лямбды. может где-то конст не написал, а оно очень сильно зависит от этого и не дает ни копировать ни тип автовывести или еще что-то там, или еще что. Но я пока не готов признать С++ "полноценным мультипарадигменным языком" (С), в свете вышеописанных моих сомнений. А gru74ik спросил, и я наспех ответил про граждан первого класса, потому что пока не готов четко озвучить сравнительные ограничения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2015, 23:04     В чем плюсы лямбд?
Еще ссылки по теме:

В чем плюсы использования автоматически реализуемых свойств? - C#
В чем плюсы использования автоматически реализуемыех свойств?ведь они ничем не отличаются от простых переменных,так как там тоже нельзя...

На чем легче писать игры? плюсы и минусы. - OpenGL
Народ,а как вы думаете/имели опыт на чем легче писать игры, и насколько хорошо возможно потом будет реализовать хорошо сделанную игру? ...

Разработка мобильного приложения на Delphi XE - в чем плюсы и минусы? - Программирование Android
Стоит ли писать приложения под мобильные платформы на Delphi XE ? Если true, тогда какие негативные моменты могут появиться ? Например,...

Целесообразность написания дополнительных скобок или "с чем плюсы вкуснее?" - C++
Ну, Вам правильно ответили, но второе условие и так будет исполняться. Т.е. если текст не пустой, то будет срабатывать любое из значений, а...

Final переменные для лямбд - Java SE
Есть некоторая коллекция цветов и некоторая коллекция кнопок (можно и не кнопок, суть не в них, суть в лямбдах). Циклом for каждой кнопке...


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

Или воспользуйтесь поиском по форуму:
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1
06.10.2015, 23:04     В чем плюсы лямбд? #40
Цитата Сообщение от _Ivana Посмотреть сообщение
их ограниченности по сравнению с полноценными лямбда-языками
я честно говоря не знаю, о каких таких ограничениях идет речь.
Yandex
Объявления
06.10.2015, 23:04     В чем плюсы лямбд?
Ответ Создать тему
Опции темы

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