Для пользователей, которые регистрируются. Если Вам не приходит письмо с подтверждением email, пишите на admin[at]quizful[dot]net - будем подтверждать вручную. Просим прощения за доставленные неудобства.

С уважением,
команда Quizful
Знаете ли Вы, что

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

Топ контрибуторов
loading
loading
Лента обновлений
ссылка May 17 19:13
Комментарий от elirijndael:
Полностью согласен с valid_name.
ссылка May 17 18:47
Комментарий от Aleksandr89:
Неплохой тест. Для тех кто хочет ещё попрактиковатьс...
ссылка May 17 15:13
Комментарий от dpdpdp:
Поменяйте радиокнопки на чекбоксы.
Во втором варианте про...
ссылка May 17 11:55
Комментарий от Torredo812:
вот это подвох!!!
забываешь что х увеличился))и думае...
ссылка May 17 10:50
Комментарий от lesha1980:
Хороший вопрос. Получается, что проверяется только x в...
Статистика

Тестов: 130, вопросов: 5791. Пройдено: 126757 / 526597.

Использование лямбда-функций (С++0x)

head tail Информация о статье
категория
C++
дата24.08.2010
авторLavroff
голосов7

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

Допустим, нам надо обязательно через алгоритм for_each вывести весь контейнер через пробелы на экран. Что мы делаем для этого с использованием лямбда-функций? Пишем вот такой простой код.


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

int main() {
    int Arr[] = {1,2,-1,-2,3,-3,4,-4,5,-5};
    std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0]));
    std::for_each(Vec.begin(), Vec.end(), [](int f){std::cout << f << ' ';});
    return 0;
}

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

Пользовательская функция:


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

void Print(int Elem) {
    std::cout << Elem << ' ';
}

int main() {
    int Arr[] = {1,2,-1,-2,3,-3,4,-4,5,-5};
    std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0]));
    std::for_each(Vec.begin(), Vec.end(), Print);
    return 0;
}

Класс с перегрузкой оператора ():


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

class Print {
public:
    void operator()(int Elem) {
        std::cout << Elem << ' ';
    }
};

int main() {
    int Arr[] = {1,2,-1,-2,3,-3,4,-4,5,-5};
    std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0]));
    std::for_each(Vec.begin(), Vec.end(), Print());
    return 0;
}

Это пример реализаций. Разница в размере кода конечно практически не заметна, однако это простой пример. На более сложных примерах будет большая разница.

Пример лямбда-функций для умножения, сложения, вычитания элементов вектора:


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

int main() { int Arr[] = {1,2,3,4,5,6,7,8,9,10}; std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0])); int Sum=0, Mult=1, Sub=0; std::for_each(Vec.begin(), Vec.end(), [&Sum, &Mult, &Sub](int Elem) {Sum+=Elem; Mult*=Elem; Sub-=Elem;}); std::cout << Sum << ' ' << Mult << ' ' << Sub << '\n'; return 0; }

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

Спасибо за внимание.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 7  loading...
k06a   Lavroff   toxx   Maxwe11   hovhannes   kazaros91   aizen