Стандарты программирования на С++. 101 правило и рекомендация - [77]
Подумайте об использовании лямбда-функций [Boost]. Лямбда-функции представляют собой важный инструмент, который позволяет справиться с основным недостатком алгоритмов, а именно с удобочитаемостью. Без их применения вы должны использовать либо функциональные объекты (но тогда тела даже простых циклов находятся в отдельном месте, далеко от точки вызова), либо стандартные связыватели и функциональные объекты наподобие >bind2nd
и >plus
(достаточно запутанные, сложные и утомительные в использовании).
Вот два примера, адаптированных из [Meyers01].
Пример 1. Преобразование >deque
. После того как было выполнено несколько некорректных итераций из-за недействительных итераторов (например, см. рекомендацию 83), мы пришли к окончательной версии цикла для прибавления 41 к каждому элементу массива данных типа >doublе
и помещения результата в дек >deque
:
>deque
>for (size_t i =0; i < max; ++i) {
> // Сохраняем current действительным
> current = d.insert(current, data[i] + 41);
> ++current; // Увеличиваем его, когда это
>} // становится безопасным
Вызов алгоритма позволяет легко обойти все ловушки в этом коде:
>transform(
> data.begin(), data.end(), // Копируем элементы
> data inserter(d, d.begin()), // в d с начала контейнера,
> bind2nd(plus
Впрочем, >bind2nd
и >plus
достаточно неудобны. Откровенно говоря, в действительности их мало кто использует, и связано это в первую очередь с плохой удобочитаемостью такого кода (см. рекомендацию 6).
При использовании лямбда-функций, генерирующих для нас функциональные объекты, мы можем написать совсем простой код:
>transform(data, data+max, inserter(d,d.begin()), _1 + 41);
Пример 2. Найти первый элемент между >x
и >у
. Рассмотрим простой цикл, который выполняет поиск в >vector
первого элемента, значение которого находится между >x
и >y
. Он вычисляет итератор, который указывает либо на найденный элемент, либо на >v.end()
:
>vector
>for (; i != v.end(); ++i)
> if (*i > x && *i < y) break;
Вызов алгоритма достаточно проблематичен. При отсутствии лямбда-функций у нас есть два варианта — написание собственного функционального объекта или использование стандартных связывателей. Увы, в последнем случае мы не можем обойтись только стандартными связывателями и должны использовать нестандартный (хотя и достаточно распространенный) адаптер >compose2
, но даже в этом случае код получается совершенно непонятным, так что такой код на практике никто просто не напишет:
>vector
> find_if(v.begin(), v.end(),
> compose2(logical_and
> bind2nd(greater
Другой вариант, а именно — написание собственного функционального объекта — достаточно жизнеспособен. Он достаточно хорошо выглядит в точке вызова, а главный его недостаток— необходимость написания функционального объекта >BetweenValues
, который визуально удаляет логику из точки вызова:
>template
>class BetweenValues : public unary_function
>public:
> BetweenValues(const T& low, const T& high)
> : low_(low), high_(high) { }
> bool operator()(const T& val) const
> { return val > low_ && val < high_; }
>private:
> T low_, high_;
>};
>vector
> find_if( v.begin(), v.end(), BetweenValues
При применении лямбда-функций можно написать просто:
>vector
> find_if(v.begin(), v.end(), _1 > x && _1 < y);
При использовании функциональных объектов тело цикла оказывается размещено в некотором месте, удаленном от точки вызова, что затрудняет чтение исходного текста. (Использование простых объектов со стандартными и нестандартными связывателями представляется нереалистичным.)
Лямбда-функции [Boost] решают проблему и надежно работают на современных компиляторах, но они не годятся для более старых компиляторов и могут выдавать большие запутанные сообщения об ошибках при некорректном использовании. Вызов же именованных функций, включая функции-члены, все равно требует синтаксиса с использованием связывателей.
[Allison98] §15 • [Austern99] §11-13 • [Boost] Lambda library • [McConnell93] §15 • [Meyers01] §43 • [Musser01] §11 • [Stroustrup00] §6.1.8, §18.5.1 • [Sutter00] §7
85. Пользуйтесь правильным алгоритмом поиска
Данная рекомендация применима к поиску определенного значения в диапазоне. При поиске в неотсортированном диапазоне используйте алгоритмы >find
/>find_if
или >count
/>count_if
. Для поиска в отсортированном диапазоне выберите >lower_bound
, >upper_bound
, >equal_range
или (реже) >binary_search
. (Вопреки своему имени, >binary_search
обычно — неверный выбор.)
В случае неотсортированных диапазонов, >find
/>find_if
и >count
/>count_if
могут за линейное время определить, находится ли данный элемент в диапазоне, и если да, то где именно. Заметим, что алгоритмы >find
/>find_if
обычно более эффективны, поскольку могут завершить поиск, как только искомый элемент оказывается найден.
В случае сортированных диапазонов лучше использовать алгоритмы бинарного поиска — >binary_search, lower_bound

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.

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

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

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

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.