Яцек Галовиц
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
Избегаем