Стандартная библиотека шаблонов

Серия: Библиотека программиста.

Галовиц Яцек «C++ 17 STL. Стандартная библиотека шаблонов» Питер, 2018 год, 432 стр., ISBN: 978-5-4461-0680-6; (9,25 мб. pdf)

С++ — объектно-ориентированный язык программирования, без которого сегодня немыслима промышленная разработка ПО. Книга по C++, научит вас максимально эффективно использовать С++17. В ней представлены примеры написания кода, основанные на языке C++ и его стандартной библиотеке шаблонов (Standard Template Library, STL). Поскольку в рассматриваемых здесь примерах STL применяется по максимуму, об этой библиотеке стоит сказать подробнее. C++ — мощный язык. Он позволяет скрывать сложные решения за простыми высокоуровневыми интерфейсами, но в то же время дает возможность писать низкоуровневый код, для которого важны высокая производительность и незначительное потребление ресурсов. Комитет ISO по стандартизации C++ старательно работает над улучшением стандарта C++.

Представленная книга расскажет о работе с контейнерами, алгоритмами, вспомогательными классами, лямбда-выражениями и другими интересными инструментами, которыми богат современный С++. Освоив материал, вы сможете коренным образом пересмотреть привычный подход к программированию. Преимущество издания — в подробном описании стандартной библиотеки шаблонов С++, STL. Ее актуальная версия была выпущена в 2017 году. В книге показаны более 90 максимально реалистичных примеров, которые демонстрируют всю мощь STL. Многие из них станут базовыми кирпичиками для решения более универсальных задач. Вооружившись этой книгой, вы сможете эффективно использовать С++17 для создания высококачественного и высокопроизводительного ПО, применимого в различных отраслях.

Оглавление книги

Содержание.

Глава 1. Новые возможности С++17
Введение 18
Применяем структурированные привязки (декомпозицию)
для распаковки набора возвращаемых значений 19
Ограничиваем область видимости переменных в выражениях if и switch 23
Новые правила инициализатора с фигурными скобками 26
Разрешаем конструктору автоматически выводить полученный тип класса шаблона 28
Упрощаем принятие решений во в рюмя компиляции с помощью constexpr-if 30
Подключаем библиотеки с помощью встраиваемых переменных 33
Реализуем вспомогательные функции с помощью выражений свертки 36

Глава 2. Контейнеры STL 
Введение 43
Используем идиому erase-remove для контейнера std::vector 46
Удаляем элементы из неотсортированного объекта класса std::vector за время 0(1) 50
Получаем доступ к экземплярам класса std::vector быстрым или безопасным способом 53
Сохраняем сортировку экземпляров класса std::vector 55
Вставляем элементы в контейнер std::тар эффективно и в соответствии с условиями 57
Исследуем новую семантику подсказок для вставки элементов с помощью метода std::map::insert 61
Эффективно изменяем ключи элементов std::map 64
Применяем контейнер std: :unordered_map для пользовательских типов 67
Отсеиваем повторяющиеся слова из пользовательского ввода и выводим их на экран в алфавитном порядке с помощью контейнера std::set 70
Реализуем простой ОЛН-калькулятор с использованием контейнера std::stack 73
Подсчитываем частоту встречаемости слов с применением контейнера std::map 79
Вспомогательный стилистический редактор для поиска длинных
предложений в текстах с помощью std::multimap 82
Реализуем личный список текущих дел с помощью std::priority_queue 87

Глава 3. Итераторы
Введение 91
Создаем собственный итерабельный диапазон данных 95
Обеспечиваем совместимость собственных итераторов с категориями итераторов STL 98
Используем оболочки итераторов для заполнения обобщенных структур данных 101
Реализуем алгоритмы с помощью итераторов 104
Перебор в обратную сторону с применением обратных адаптеров для итераторов 108
Завершение перебора диапазонов данных с использованием ограничителей 110
Автоматическая проверка кода итераторов с помощью проверяемых итераторов 113
Создаем собственный адаптер для итераторов-упаковщиков 117

Глава 4. Лямбда-выражения
Введение 123
Динамическое определение функций с помощью лямбда-выражений 125
Добавляем полиморфизм путем оборачивания лямбда-выражений std::function129
Создаем функции методом конкатенации 132
Создаем сложные предикаты с помощью логической конъюнкции 136
Вызываем несколько функций с одинаковыми входными данными 138
Реализуем функцию transform_if с применением std::accumulate и лямбда-выражений 141
Генерируем декартово произведение на основе любых входных данных во время компиляции 146

Глава 5. Основы работы с алгоритмами STL 
Введение 151
Копируем элементы из одних контейнеров в другие 153
Сортируем контейнеры 157
Удаляем конкретные элементы из контейнеров 161
Преобразуем содержимое контейнеров 164
Выполняем поиск элементов в упорядоченных и неупорядоченных векторах 166
Ограничиваем допустимые значения вектора конкретным численным диапазоном с помощью std::clamp 172
Находим шаблоны в строках с помощью функции std::search и выбираем оптимальную реализацию 175
Делаем выборку данных из крупных векторов 179
Выполняем перестановки во входных последовательностях 182
Инструмент для слияния словарей 184

Глава 6. Сложные случаи использования алгоритмов БП 
Введение 188
Реализуем класс префиксного дерева с использованием алгоритмов БП 189
Создаем генератор поисковых подсказок с помощью префиксных деревьев 194
Реализуем формулу преобразования Фурье с применением численных алгоритмов БП 199
Определяем ошибку суммы двух векторов 207
Реализуем отрисовацик множества Мандельброта в ASCII 210
Создаем собственный алгоритм split 215
Создаем полезные алгоритмы на основе стандартных алгоритмов gather 219
Удаляем лишние пробелы между словами 223
Компрессия и декомпрессия строк 225

Глава 7. Строки, классы потоков и регулярные выражения
Введение 229
Создание, конкатенация и преобразование строк 231
Удаляем пробелы из начала и конца строк 234
Преимущества использования std::string без затрат на создание объектов std: :string 236
Считываем значения из пользовательского ввода 240
Подсчитываем все слова в файле 243
Форматируем ваши выходные данные с помощью манипуляторов потока ввода-вывода 245
Инициализируем сложные объекты из файла вывода 251
Заполняем контейнеры с применением итераторов std::istream 254
Выводим любые данные на экран с помощью итераторов std::ostream 258
Перенаправляем выходные данные в файл для конкретных разделов кода 262
Создаем пользовательские строковые классы путем наследования std::char_traits 266
Токенизация входных данных с помощью библиотеки для работы с регулярными выражениями 271
Удобный и красивый динамический вывод чисел на экран в зависимости от контекста 275
Перехватываем читабельные исключения для ошибок потока std::iostream 277

Глава 8. Вспомогательные классы
Введение 281
Преобразуем единицы измерения времени с помощью std:: ratio 282
Выполняем преобразование между абсолютными и относительными значениями с использованием std::chrono 287
Безопасно извещаем о сбое с помощью std::optional 290
Применяем функции для кортежей 293
Быстрое создание структур данных с помощью std::tuple 296
Замена void* с использованием std::any для повышения безопасности типов 303
Хранение разных типов с применением std::variant 306
Автоматическое управление ресурсами с помощью std::unique_ptr 311
Автоматическое управление разделяемой памятью кучи с использованием std::shared_ptr 314
Работаем со слабыми указателями на разделяемые объекты 320
Упрощаем управление ресурсами устаревших API с применением умных указателей 324
Открываем доступ к разным переменным — членам одного объекта 327
Генерируем случайные числа и выбираем правильный генератор случайных чисел 330
Генерируем случайные числа и создаем конкретные распределения с помощью STL 335

Глава 9. Параллелизм и конкурентность
Введение 343
Автоматическое распараллеливание кода, использующего стандартные алгоритмы 344
Приостанавливаем программу на конкретный промежуток времени 350
Запускаем и приостанавливаем потоки 352
Выполняем устойчивую к исключениям общую блокировку с помощью std::unique_lock и std:: shared_lock 356
Избегаем взаимных блокировок с применением std: :scoped_lock 363
Синхронизация конкурентного использования std::cout 366
Безопасно откладываем инициализацию с помощью std::call_once 370
Отправляем выполнение задач в фоновый режим с применением std::async 372
Реализуем идиому «производитель/потребитель» с использованием std::condition_variable 377
Реализуем идиому «несколько производителей/потребителей» с помощью std::condition_variable 381
Распараллеливание отрисовщика множества Мандельброта в ASCII с применением std::async 387
Небольшая автоматическая библиотека для распараллеливания с использованием std::future 391

Глава 10. Файловая система
Введение 400
Реализуем нормализатор пути файла 401
Получаем канонические пути к файлам из относительных путей 404
Составляем список всех файлов в каталоге 407
Инструмент текстового поиска в стиле дгер 412
Инструмент для автоматического переименования файлов 415
Создаем индикатор эксплуатации диска 418
Подбиваем статистику о типах файлов 420
Инструмент для уменьшения размера папки путем замены дубликатов символьными ссылками 423

СкачатьPDF

Похожая литература