Оглавление
Об авторе....................................................................................................................... 10
О научном редакторе .................................................................................................... 11
Предисловие.................................................................................................................. 12
Содержание книги ......................................................................................................... 12
Что потребуется для работы с книгой.......................................................................... 13
Кому адресована эта книга .......................................................................................... 13
Типографские соглашения ........................................................................................... 14
Отзывы и пожелания .................................................................................................... 14
Скачивание исходного кода примеров......................................................................... 15
Список опечаток ............................................................................................................ 15
Нарушение авторских прав .......................................................................................... 15
Глава 1. Классический полиморфизм и обобщенное программирование................ 16
Конкретные мономорфные функции ........................................................................... 16
Классические полиморфные функции. ....................................................................... 17
Обобщенное программирование с шаблонами ......................................................... 19
Итоги............................................................................................................................... 22
Глава 2. Итераторы и диапазоны................................................................................. 24
Проблема целочисленных индексов ........................................................................... 24
За границами указателей ............................................................................................. 25
Константные итераторы ............................................................................................... 28
Пара итераторов определяет диапазон ...................................................................... 29
Категории итераторов.................................................................................................... 31
Итераторы ввода и вывода .......................................................................................... 33
Объединяем все вместе ............................................................................................... 36
Устаревший std::iterator. ................................................................................................ 39
Итоги ............................................................................................................................... 42
Глава 3. Алгоритмы с парами итераторов ................................................................... 44
Замечание о заголовках................................................................................................. 44
Диапазонные алгоритмы только для чтения................................................................ 44
Манипулирование данными с std::copy......................................................................... 51
Вариации на тему: std::move и std::move_iterator ........................................................ 54
Непростое копирование с std::transform........................................................................ 57
Диапазонные алгоритмы только для записи................................................................. 59
Алгоритмы, влияющие на жизненный цикл объектов.................................................. 60
Наш первый перестановочный алгоритм: std::sort ...................................................... 62
Обмен местами, обратное упорядочение и разделение............................................. 63
Ротация и перестановка................................................................................................. 67
Кучи и пирамидальная сортировка................................................................................ 69
Слияние и сортировка слиянием. ................................................................................. 71
Поиск и вставка в сортированный массив с std::lower_bound..................................... 71
Удаление из сортированного массива с std::remove_if ............................................... 73
Итоги................................................................................................................................ 77
Глава 4. Зоопарк контейнеров........................................................................................78
Понятие владения.......................................................................................................... 78
Простейший контейнер: std::array.................................................................................. 80
Рабочая лошадка: std::vector.......................................................................................... 84
Изменение размера std::vector....................................................................................... 85
Вставка и стирание в std::vector .................................................................................... 89
Ловушки vector. ............................................................................................................... 90
Ловушки в конструкторах перемещения без noexcept.................................................. 91
Быстрый гибрид: std::deque. .......................................................................................... 93
Особый набор возможностей: std::list ........................................................................... 94
Какие отличительные особенности имеет std::list?...................................................... 95
Список без удобств std::forward_list............................................................................... 97
Абстракции с использованием std::stack и std::queue.................................................. 98
Удобный адаптер: std::priority_queue ............................................................................ 99
Деревья: std::set и std::map ......................................................................................... 100
Замечание о прозрачных компараторах..................................................................... 104
Необычные std::multiset и std::multimap...................................................................... 105
Перемещение элементов без перемещения...............................................................107
Хеши: std::unordered_set и std::unordered_map.......................................................... 109
Фактор загрузки и списки в корзинах ...........................................................................111
Откуда берется память? .............................................................................................. 112
Итоги............................................................................................................................... 113
Глава 5. Словарные типы ............................................................................................ 114
История std::string ......................................................................................................... 114
Маркировка ссылочных типов с reference_wrapper ................................................... 116
C++11 и алгебраические типы ..................................................................................... 117
Работа с std::tuple ..........................................................................................................118
Манипулирование значениями кортежа...................................................................... 120
Замечание об именованных классах .......................................................................... 121
Выражение альтернатив с помощью std::variant ....................................................... 122
Чтение вариантов ........................................................................................................ 123
О make_variant и семантике типа-значения .............................................................. 125
Задержка инициализации с помощью std::optional ................................................... 127
И снова variant .............................................................................................................. 131
Бесконечное число альтернатив с std::any ................................................................ 132
std::any и полиморфные типы...................................................................................... 134
Коротко о стирании типа ............................................................................................. 135
std::any и копирование ................................................................................................. 137
И снова о стирании типов: std::function ...................................................................... 138
std::function, копирование и размещение в динамической памяти. ......................... 140
Итоги ............................................................................................................................. 141
Глава 6. Умные указатели ........................................................................................... 142
История появления умных указателей ....................................................................... 142
Умные указатели никогда ничего не забывают. ......................................................... 143
Автоматическое управление памятью с std::unique_ptr .............................................144
Почему в C++ нет ключевого слова nally .....................................................................147
Настройка обратного вызова удаления ...................................................................... 148
Управление массивами с помощью std::unique_ptr ................................................... 149
Подсчет ссылок с std::shared_ptr ................................................................................. 150
Не допускайте двойного управления! ........................................................................ 153
Удерживание обнуляемых дескрипторов с помощью weak_ptr ................................ 153
Сообщение информации о себе с std::enable_shared_from_this .............................. 156
Странно рекурсивный шаблон проектирования ........................................................ 159
Заключительное замечание ........................................................................................ 160
Обозначение неисключительности с observer_ptr ..................................................... 160
Итоги .............................................................................................................................. 162
Глава 7. Конкуренция ................................................................................................... 163
Проблемы с volatile ...................................................................................................... 163
Использование std::atomic для безопасного доступа
в многопоточной среде ................................................................................................ 166
Атомарное выполнение сложных операций .............................................................. 168
Большие атомарные типы ........................................................................................... 170
Поочередное выполнение с std::mutex ....................................................................... 171
Правильный порядок «приобретения блокировок» ................................................... 173
Всегда связывайте мьютекс с управляемыми данными ............................................176
Специальные типы мьютексов .................................................................................... 180
Повышение статуса блокировки для чтения/записи ................................................. 183
Понижение статуса блокировки для чтения/записи. ................................................. 183
Ожидание условия ....................................................................................................... 184
Обещания о будущем. ................................................................................................. 187
Подготовка заданий для отложенного выполнения .................................................. 190
Будущее механизма future ........................................................................................... 192
Поговорим о потоках... ................................................................................................. 194
Идентификация отдельных потоков и текущего потока. ........................................... 196
Исчерпание потоков и std::async.................................................................................. 198
Создание своего пула потоков .................................................................................... 200
Оптимизация производительности пула потоков ...................................................... 204
Итоги ............................................................................................................................. 206
Глава 8. Диспетчеры памяти ...................................................................................... 208
Диспетчер памяти обслуживает ресурс памяти. ...................................................... 209
Еще раз об интерфейсах и понятиях ........................................................................ 210
Определение кучи с помощью memory_resource ..................................................... 212
Использование стандартных ресурсов памяти ........................................................ 215
Выделение из ресурса пулов ......................................................................................217
500-головый стандартный диспетчер памяти ........................................................... 218
Метаданные, сопровождающие причудливые указатели. ....................................... 222
Прикрепление контейнера к единственному ресурсу памяти. ................................ 227
Использование диспетчеров памяти стандартных типов. ........................................229
Настройка ресурса памяти по умолчанию ................................................................ 230
Создание контейнера с поддержкой выбора диспетчера памяти ............................231
Передача вниз с scoped_allocator_adaptor ................................................................ 237
Передача разных диспетчеров памяти ..................................................................... 240
Итоги ............................................................................................................................ 242
Глава 9 Потоки ввода/вывода ................................................................................... 244
Проблемы ввода/вывода в C++ ................................................................................. 244
Буферизация и форматирование .............................................................................. 246
POSIX API .................................................................................................................... 247
Стандартный C API ..................................................................................................... 250
Буферизация в стандартном C API ........................................................................... 252
Форматирование с помощью printf и snprintf ............................................................. 257
Классическая иерархия потоков ввода/вывода ......................................................... 260
Потоки данных и манипуляторы ................................................................................. 264
Потоки данных и обертки ............................................................................................ 267
Решение проблемы манипуляторов ........................................................................... 269
Форматирование с ostringstream ................................................................................. 270
Примечание о региональных настройках ................................................................... 271
Преобразование чисел в строки ................................................................................. 273
Преобразование строк в числа. .................................................................................. 275
Чтение по одной строке или по одному слову ........................................................... 279
Итоги .............................................................................................................................. 281
Глава 10. Регулярные выражения .............................................................................. 282
Что такое регулярное выражение?.............................................................................. 283
Замечание об экранировании обратными слешами ................................................. 284
Воплощение регулярных выражений в объектах std::regex ..................................... 286
Сопоставление и поиск ................................................................................................ 287
Извлечение совпадений с подвыражениями ............................................................. 288
Преобразование совпадений в значения данных ..................................................... 292
Итерации по нескольким совпадениям....................................................................... 293
Использование регулярных выражений для замены строк ...................................... 297
Грамматика регулярных выражений ECMAScript ...................................................... 299
Непоглощающие конструкции ..................................................................................... 302
Малопонятные особенности и ловушки ECMAScript ................................................. 303
Итоги .............................................................................................................................. 305
Глава 11. Случайные числа ......................................................................................... 306
Случайные и псевдослучайные числа ....................................................................... 306
Проблема функции rand() ............................................................................................ 308
Решение проблем с ..................................................................................................... 310
Генераторы ................................................................................................................... 310
Истинно случайные биты и std::random_device ......................................................... 311
Псевдослучайные биты с std::mt19937 ....................................................................... 311
Фильтрация вывода генераторов с помощью адаптеров. ........................................ 313
Распределения ............................................................................................................. 316
Имитация броска игровой кости с uniform_int_distribution ........................................ 316
Генерирование выборок с normal_distribution ............................................................ 318
Взвешенный выбор с discrete_distribution .................................................................. 319
Перемешивание карт с std::shufe ................................................................................ 320
Итоги .............................................................................................................................. 321
Глава 12. Файловая система. ...................................................................................... 323
Примечание о пространствах имен ............................................................................ 323
Очень длинное примечание об уведомлениях об ошибках. ......................................325
Использование ..............................................................................................................327
Коды ошибок и условия ошибок .................................................................................. 331
Возбуждение ошибок с std::system_error .................................................................... 334
Файловые системы и пути ........................................................................................... 336
Представление путей в C++ ........................................................................................ 338
Операции с путями ....................................................................................................... 340
Получение информации о файлах с directory_entry .................................................. 342
Обход каталогов с directory_iterator ............................................................................ 343
Рекурсивный обход каталогов ..................................................................................... 343
Изменение файловой системы ................................................................................... 344
Получение информации о диске ................................................................................. 345
Итоги .............................................................................................................................. 346
Предметный указатель ..................................................................................................347