Яцек Галовиц C++17 STL Стандартная библиотека шаблонов

Оглавление

Предисловие

Темы, рассмотренные в этой книге

Что вам нужно для работы с книгой

Для кого предназначено издание

Разделы

Условные обозначения

Загрузка примеров кода

Глава 1. Новые возможности С++17

Введение

Применяем структурированные привязки (декомпозицию) для распаковки набора возвращаемых значений

Ограничиваем область видимости переменных в выражениях if и switch

Новые правила инициализатора с фигурными скобками

Разрешаем конструктору автоматически выводить полученный тип класса шаблона

Упрощаем принятие решений во время компиляции с помощью constexpr-if

Подключаем библиотеки с помощью встраиваемых переменных

Реализуем вспомогательные функции с помощью выражений свертки

Глава 2. Контейнеры STL

Введение

Используем идиому erase-remove для контейнера std::vector

Удаляем элементы из неотсортированного объекта класса std::vector за время O(1)

Получаем доступ к экземплярам класса std::vector быстрым или безопасным способом

Сохраняем сортировку экземпляров класса std::vector

Вставляем элементы в контейнер std::map эффективно и в соответствии с условиями

Исследуем новую семантику подсказок для вставки элементов с помощью метода std::map::insert

Эффективно изменяем ключи элементов std::map

Применяем контейнер std::unordered_map для пользовательских типов

Отсеиваем повторяющиеся слова из пользовательского ввода и выводим их на экран в алфавитном порядке с помощью контейнера std::set

Реализуем простой ОПН-калькулятор с использованием контейнера std::stack

Подсчитываем частоту встречаемости слов с применением контейнера std::map

Вспомогательный стилистический редактор для поиска длинных предложений в текстах с помощью std::multimap

Реализуем личный список текущих дел с помощью std::priority_queue

Глава 3. Итераторы

Введение

Создаем собственный итерабельный диапазон данных

Обеспечиваем совместимость собственных итераторов с категориями итераторов STL

Используем оболочки итераторов для заполнения обобщенных структур данных

Реализуем алгоритмы с помощью итераторов

Перебор в обратную сторону с применением обратных адаптеров для итераторов

Завершение перебора диапазонов данных с использованием ограничителей

Автоматическая проверка кода итераторов с помощью проверяемых итераторов

Создаем собственный адаптер для итераторов-упаковщиков

Глава 4. Лямбда-выражения

Введение

Динамическое определение функций с помощью лямбда-выражений

Добавляем полиморфизм путем оборачивания лямбда-выражений в std::function

Создаем функции методом конкатенации

Создаем сложные предикаты с помощью логической конъюнкции

Вызываем несколько функций с одинаковыми входными данными

Реализуем функцию transform_if с применением std::accumulate и лямбда-выражений

Генерируем декартово произведение на основе любых входных данных во время компиляции

Глава 5. Основы работы с алгоритмами STL

Введение

Копируем элементы из одних контейнеров в другие

Сортируем контейнеры

Удаляем конкретные элементы из контейнеров

Преобразуем содержимое контейнеров

Выполняем поиск элементов в упорядоченных и неупорядоченных векторах

Ограничиваем допустимые значения вектора конкретным численным диапазоном с помощью std::clamp

Находим шаблоны в строках с помощью функции std::search и выбираем оптимальную реализацию

Делаем выборку данных из крупных векторов

Выполняем перестановки во входных последовательностях

Инструмент для слияния словарей

Глава 6. Сложные случаи использования алгоритмов STL

Введение

Реализуем класс префиксного дерева с использованием алгоритмов STL

Создаем генератор поисковых подсказок с помощью префиксных деревьев

Реализуем формулу преобразования Фурье с применением численных алгоритмов STL

Определяем ошибку суммы двух векторов

Реализуем отрисовщик множества Мандельброта в ASCII

Создаем собственный алгоритм split

Создаем полезные алгоритмы на основе стандартных алгоритмов gather

Удаляем лишние пробелы между словами

Компрессия и декомпрессия строк

Глава 7. Строки, классы потоков и регулярные выражения

Введение

Создание, конкатенация и преобразование строк

Удаляем пробелы из начала и конца строк

Преимущества использования std::string без затрат на создание объектов std::string

Считываем значения из пользовательского ввода

Подсчитываем все слова из пользовательского ввода

Форматируем ваши выходные данные с помощью манипуляторов потока ввода-вывода

Инициализируем сложные объекты из файла вывода

Заполняем контейнеры с применение итераторов std::istream

Выводим любые данные на экран с помощью итераторов std::ostream

Перенаправляем выходные данные в файл для конкретных разделов кода

Создаем пользовательские строковые классы путем наследования std::char_traits

Токенизация входных данных с помощью библиотеки для работы с регулярными выражениями

Удобный и красивый динамический вывод чисел на экран в зависимости от контекста

Перехватываем читабельные исключения для ошибок потока std::iostream

Глава 8. Вспомогательные классы

Введение

Преобразуем единицы измерения времени с помощью std::ratio

Выполняем преобразование между абсолютными и относительными значениями с использованием std::chrono

Безопасно извещаем о сбое с помощью std::optional

Применяем функции для кортежей

Быстрое создание структур данных с помощью std::tuple

Замена void* с использованием std::any для повышения безопасности типов

Хранение разных типов с применением std::variant

Автоматическое управление ресурсами с помощью std::unique_ptr

Автоматическое управление разделяемой памятью кучи с использованием std::shared_ptr

Работаем со слабыми указателями на разделяемые объекты

Упрощаем управление ресурсами устаревших API с применением умных указателей

Открываем доступ к разным переменным — членам одного объекта

Генерируем случайные числа и выбираем правильный генератор случайных чисел

Генерируем случайные числа и создаем конкретные распределения с помощью STL

Глава 9. Параллелизм и конкурентность

Введение

Автоматическое распараллеливание кода, использующего стандартные алгоритмы

Приостанавливаем программу на конкретный промежуток времени

Запускаем и приостанавливаем потоки

Выполняем устойчивую к исключениям общую блокировку с помощью std::unique_lock и std::shared_lock

Избегаем взаимных блокировок с применением std::scoped_lock

Синхронизация конкурентного использования std::cout

Безопасно откладываем инициализацию с помощью std::call_once

Отправляем выполнение задач в фоновый режим с применением std::async

Реализуем идиому «производитель/потребитель» с использованием std::condition_variable

Реализуем идиому «несколько производителей/потребителей» с помощью std::condition_variable

Распараллеливание отрисовщика множества Мандельброта в ASCII с применением std::async

Небольшая автоматическая библиотека для распараллеливания с использованием std::future

Глава 10. Файловая система

Введение

Реализуем нормализатор пути файла

Получаем канонические пути к файлам из относительных путей

Составляем список всех файлов в каталоге

Инструмент текстового поиска в стиле grep

Инструмент для автоматического переименования файлов

Создаем индикатор эксплуатации диска

Подбиваем статистику о типах файлов

Инструмент для уменьшения размера папки путем замены дубликатов символьными ссылками

Об авторе

О рецензенте

Загрузка...