C++. Сборник рецептов - [104]
>#include
>#include
>#include
>#include
>#include
>#include "utils.h" // Для printContainer(): см. 7.10
>using namespace std;
>int main() {
> cout << "Введите набор строк: ";
> istream_iterator
> istream_iterator
> vector
> // Стандартный алгоритм sort сортирует элементы диапазона. Он
> // требует итератор произвольного доступа, так что он работает для vector.
> sort(v.begin(), v.end());
> printContainer(v);
> random_shuffle(v.begin(), v.end()); // См. 7.2
> string* arr = new string[v.size()];
> // Копируем элементы в массив
> copy(v.begin(), v.end(), &arr[0]);
> // Сортировка работает для любого типа диапазонов, но при условии, что
> // ее аргументы ведут себя как итераторы произвольного доступа.
> sort(&arr[0], &arr[v.size()]);
> printRange(&arr[0], &arr[v.size()]);
> // Создаем список с такими же элементами
> list
> lst.sort(); // Самостоятельная версия sort работать не будет, здесь требуется
> // использовать list::sort. Заметьте, что невозможно отсортировать
> // только часть списка.
> printContainer(lst);
>}
Запуск примера 7.6 может выглядеть вот так.
>Введите набор строк: a z b y c x d w
>^Z
>-----
>a b c d w x y z
>-----
>w b y c a x z d
>-----
>a b c d w x y z
>-----
>a b c d w x y z
Сортировка — это очень часто выполняющаяся операция, и есть два способа отсортировать последовательность. Можно обеспечить хранение элементов в определенном порядке с помощью ассоциативного контейнера, но при этом длительность операции вставки будет иметь логарифмическую зависимость от размера последовательности. Либо можно сортировать элементы только по мере надобности с помощью >sort
, имеющей несколько опций.
Стандартный алгоритм >sort
делает именно то, что от него ожидается: он сортирует элементы диапазона в восходящем порядке с помощью >operator<
. Он объявлен вот так.
>void sort(Rnd first, Rnd last);
>void sort(Rnd first, Rnd last, BinPred comp);
Как и в большинстве других алгоритмов, если >operator<
не удовлетворяет вашим требованиям, можно указать собственный оператор сравнения. В среднем случае сложность имеет зависимость n log n. В худшем случае она может быть квадратичной.
Если требуется, чтобы одинаковые элементы сохранили свой первоначальный порядок, используйте >stable_sort
. Он имеет такую же сигнатуру, но гарантирует, что порядок эквивалентных элементов изменен не будет. Его сложность при наличии достаточного объема памяти в худшем случае составляет n log n. Если памяти недостаточно, то сложность может оказаться равной n(log n)².
Однако >sort
работает не для всех контейнеров. Он требует итераторов произвольного доступа, так что при использовании контейнера, не предоставляющего таких итераторов, он неприменим. Итераторы произвольного доступа предоставляют стандартные последовательные контейнеры >deque
, >vector
и >string
/>wstring
(которые не являются контейнерами, но удовлетворяют большинству требований к ним), >list
— это единственный, который такого итератора не предоставляет. Если требуется отсортировать список, используйте >list::sort
. Например, в примере 7.6 вы, вероятно, заметили, что >list::sort
не принимает никаких аргументов.
>lst.sort();
Это отличает его от >std::sort
, с помощью которого можно отсортировать только часть последовательности. Если требуется отсортировать часть последовательности, то не следует использовать >list
.
Концепция сортировки очень проста, но есть несколько вариаций на тему ее реализации в стандартной библиотеке. Следующий перечень описывает эти вариации.
>partial_sort
Принимает три итератора произвольного доступа — >first
, >middle
и >last
— и (необязательно) функтор сравнения. Он имеет два постусловия: элементы диапазона (>first
, >middle
) будут меньше, чем элементы диапазона (>middle
, >last
), и диапазон (>first
, >middle
) будет отсортирован с помощью >operator<
или указанного функтора сравнения. Другими словами, он сортирует только первые n элементов.
>partial_sort_сору
Делает то же, что и >partial_sort
, но помещает результаты в выходной диапазон. Он берет первые n элементов из исходного диапазона и в соответствующем порядке копирует их в результирующий диапазон. Если результирующий диапазон (n) короче, чем исходный диапазон (m), то в результирующий диапазон копируется только n элементов.
>nth_element
Принимает три итератора произвольного доступа — >first
, >nth
и >last
— и необязательный функтор сравнения. Он помешает элемент, на который ссылается >nth
, в то место, где он находился бы, если бы весь диапазон был отсортирован. Следовательно, все элементы диапазона (>first
, >nth
) будут меньше, чем элемент в позиции >nth
(те, что находятся в диапазоне (>nth
, >last
) не сортируются, но больше, чем те, что предшествуют >nth
). Этот алгоритм следует использовать тогда, когда требуется отсортировать только один или несколько элементов диапазона и избежать затрат на сортировку всего диапазона.
Также можно разделить элементы диапазона в соответствии с каким-либо критерием (функтором), и это является предметом обсуждения рецепта 7.7.
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
Система сборки программ, используемая во FreeBSD, имеет значительно большие возможности, чем те, которые мы задействовали. Какие это возможности и как их использовать в своих портах?
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.
«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.