C++17 STL Стандартная библиотека шаблонов — страница 2 из 119

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

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

Заполняем контейнеры с применение итераторов 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

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

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

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

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

Об авторе

О рецензенте

Предисловие

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

С++ — мощный язык. Он позволяет скрывать сложные решения за простыми высокоуровневыми интерфейсами, но в то же время дает возможность писать низкоуровневый код, для которого важны высокая производительность и незначительное потребление ресурсов. Комитет ISO по стандартизации C++ старательно работает над улучшением стандарта С++.

Сегодняшний С++ (сам язык и библиотека шаблонов) предоставляет средства для работы со сложными структурами данных и алгоритмами, предлагает возможность управления ресурсами с помощью автоматических указателей, а также поддерживает лямбда-выражения, константные выражения, переносимые средства управления потоками для параллельного (конкурентного) программирования, регулярные выражения, генераторы случайных чисел, исключения, шаблоны с переменным количеством аргументов (эта часть языка C++, отвечающая за шаблонные типы, является полной по Тьюрингу!), определенные пользователями литералы, переносимые средства работы с файловой системой и многое другое. Такое количество возможностей делает С++ универсальным языком, который идеально подходит для реализации высококачественного и высокопроизводительного программного обеспечения, применимого в различных отраслях.

Однако многие разработчики С++ охотно изучают сам язык, а библиотеку STL переводят на задний план. Применение языка C++ без поддержки стандартной библиотеки зачастую приводит к тому, что программы выглядят так, будто написаны с использованием классов, а не с учетом современных подходов. Это печально, ведь подобное применение языка не дает задействовать всю его мощь.

В четвертом издании своей книги The C++ Programming Language («Язык программирования С++»), включающем сведения в том числе о С++11, Бьярн Страуструп (Bjarne Stroustrup) пишет: «Пожалуйста, помните, что эти возможности языка и стандартной библиотеки призваны поддержать приемы программирования, позволяющие разрабатывать качественное ПО. Для решения какой-то конкретной задачи их нужно использовать в комбинации друг с другом — как кирпичики из одного набора, — а не отдельно и изолированно друг от друга».

Именно этому посвящена настоящая книга и все приведенные в ней примеры. Они максимально приближены к реальной жизни, причем без ориентации на какие-либо внешние библиотеки — только на STL. Данное обстоятельство значительно упрощает работу, избавляя от утомительной настройки среды. Я очень надеюсь, что представленные здесь примеры привнесут вдохновение в вашу работу с языком С++. Возможно, вы обнаружите, что некоторые из них являются отличными стандартными кирпичиками для решения задач более высокого уровня. 

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

Глава 1 «Новые возможности С++17» посвящена новому функционалу, привнесенному стандартом С++17 в сам язык С++. В следующих главах мы уже сконцентрируемся на функционале STL.

Глава 2 «Контейнеры STL» содержит объяснение, как были улучшены разнообразные контейнеры структур данных, предоставляемые STL. После рассмотрения всей коллекции контейнеров мы более детально изучим новые дополнения к ним.