2012-07-04 4 views
4

Я читал эти объяснения на страницах MSDN, за преимущества выражения лямбда над функтором и указателем функции. Что подразумевается под умением «сохранить состояние»? Связано ли это с возможностью захвата некоторых переменных посредством ref или значения в охватывающей области?C++ Что означает «состояние сохранения»?

http://msdn.microsoft.com/en-us/library/dd293608.aspx

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

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

Следующие примеры сравнивают использование лямбда-выражения с использованием функционального объекта . В первом примере используется лямбда-выражение для печати на консоль независимо от того, является ли каждый элемент в векторном объекте четным или нечетным. Второй пример использует объект функции для выполнения той же задачи .

Не могли бы вы указать на некоторую релевантную ссылку на темы scope, state, maintenance state, преимущества лямбда-выражений?

Спасибо и привет

ответ

7

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

class Counter 
{ 
    int n; 
public: 
    Counter() :n(0) {} 
    int operator()() { return n++; }  
}; 

С помощью этого класса, я могу создать экземпляр, который действует в качестве функции, и каждый раз, когда вы называете это, он запоминает предыдущее значение п, например,

Counter x; 
cout << x() << '\n'; 
cout << x() << '\n'; 
cout << x() << '\n'; 

Вы не можете сделать это с помощью обычных функций. Но вы можете это сделать с помощью лямбда:

int n = 0; 
auto x = [=]() mutable { return n++; }; 
cout << x() << '\n'; 
cout << x() << '\n'; 
cout << x() << '\n'; 
+1

Хм ... вам не нужно «изменяться» где-нибудь в определении лямбда, чтобы это работало? –

+0

@ MatthieuM. Да спасибо. Я почти всегда захватываю по ссылке, поэтому я забыл об этом. –

+0

@BenjaminLindley Но при захвате по ссылке вам нужно изменить для изменения упомянутого объекта, не так ли? –

Смежные вопросы