Пушыстый (_winnie) wrote,
Пушыстый
_winnie

Category:

лямбда в C++ - уже работающая реальность

В питоне у функций сортировки, min(список) есть параметр key, это callback-функция которая говорит, по какому признаку отсортировать. У сортировки есть ещё параметр cmp, callback в котором пользователь задаёт свою функцию сравнения двух величин. Так вот, я им ни разу не воспользовался. Всегда было достаточно key.

В связи с чем обидно, что у C++ных std::sort, std::min_element это указать невозможно, в коде callback нужно указывать в два раза больше чем хочется.

Кстати, в C++ появились лямбда функции, их уже можно использовать в gcc4.что.то.там и Visual C++ 2010.

Теперь что бы найти в массиве наиболее близкий к val можно писать
int *a_min = std::min_element(a_begin, a_end, [=](int x, int y) { return abs(x-val) < abs(y-val); });

Можно в вашу велосипедную корпоративную библиотеку утилит добавить min_by_key, что бы писать
int *a_min = my::min_by_key(array, [=](int x) { return abs(x-val); });

Раньше, что бы воспользоваться уже написаным std::min_element, приходилось писать мего-функтор где-то на страницу кода выше, за пределом экрана. Про boost::* молчу. Это приводило к тому, что рукописный цикл был и читаемей, и проще писался. Единственный алгоритм который сцали писать с нуля - это std::sort. Теперь же можно писать просто и наглядно, при code-review не нужно анализировать, сделали ли типичную опечатку в коде поиска минимума, что будет если список пустой.

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

upd: поторопился, сейчас распространён gcc4.4, а лямбды сделали в gcc4.5, который вот-вот будет в дефолтных дистрибутивах. Надо перепостить это через полгодика :)
Tags: c++, soft-dev
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 53 comments