Стандартная библиотека С++ содержит набор универсальных классов и интерфейсов, значительно расширяющих ядро языка С++. Однако эта библиотека не является самоочевидной. Для того чтобы полнее использовать возможности ее компонентов и извлечь из них максимальную пользу, необходим полноценный справочник, а не простое перечисление классов и их функций.
В данной книге описывается библиотека как часть нового стандарта ANSI/ISO C++ (C++11). Здесь содержится исчерпывающее описание каждого компонента библиотеки, включая его предназначение и структуру очень подробно описываются сложные концепции и тонкости практического программирования, необходимые для их эффективного использования, а также ловушки и подводные камни приводятся точные сигнатуры и определения наиболее важных классов и функций, а также многочисленные примеры работоспособных программ. Основным предметом изучения в книге является стандартная библиотека шаблонов (STL), в частности контейнеры, итераторы, функциональные объекты и алгоритмы.
Author(s): Джосаттис Николаи М.
Publisher: Вильямс
Year: 2014
Language: Russian
Pages: 1140
Tags: Библиотека;Компьютерная литература;C / C++;
Содержание......Page 8
Предисловие ко второму изданию......Page 21
Благодарности ко второму изданию......Page 22
Предисловие к первому изданию......Page 23
Благодарности к первому изданию......Page 24
Ждем ваших отзывов!......Page 26
1.1. Для чего предназначена эта книга......Page 27
1.3. Стиль и структура книги......Page 28
Содержание книги......Page 29
1.6. Примеры и дополнительная информация......Page 31
1.7. Обратная связь......Page 32
2.1. История стандартов языка C++......Page 33
2.1.1. Обычные вопросы о стандарте C++11......Page 34
2.1.2. Совместимость стандартов С++98 и С++11......Page 35
2.2. Сложность и О-обозначения......Page 36
3.1.1. Небольшие, но важные синтаксические уточнения......Page 39
3.1.2. Автоматическое выведение типа с помощью ключевого слова auto......Page 40
3.1.3. Универсальная инициализация и списки инициализации......Page 41
3.1.4. Диапазонные циклы for......Page 43
3.1.5. Семантика перемещения и rvalue-ссылки......Page 45
3.1.6. Новые строковые литералы......Page 50
3.1.7. Ключевое слово noexcept......Page 51
3.1.8. Ключевое слово constexpr......Page 53
3.1.9. Новые возможности шаблонов......Page 54
3.1.10. Лямбда-выражения и лямбда-функции......Page 55
3.1.13. Перечисления с ограниченной областью видимости......Page 60
3.2. Старые “новые” средства языка......Page 61
3.2.1. Неявная инициализация фундаментальных типов......Page 65
3.2.2. Определение функции main()......Page 66
4.1. Пространство имен std......Page 67
4.2. Заголовочные файлы......Page 68
4.3. Обработка ошибок и исключений......Page 69
4.3.1. Стандартные классы исключений......Page 70
4.3.2. Члены классов исключений......Page 73
4.3.4. Генерирование стандартных исключений......Page 82
4.3.5. Наследование классов стандартных исключений......Page 83
4.4. Вызываемые объекты......Page 84
4.5. Параллельное программирование и многопоточность......Page 85
4.6. Распределители памяти......Page 87
5.1. Пары и кортежи......Page 89
5.1.1. Пары......Page 90
5.1.2. Кортежи......Page 98
5.1.3. Ввод-вывод кортежей......Page 104
5.2. Интеллектуальные указатели......Page 106
5.2.1. Класс shared_ptr......Page 107
5.2.2. Класс weak_ptr......Page 115
5.2.3. Неправильное использование совместно используемых указателей......Page 120
5.2.4. Подробное описание совместно используемых и слабых указателей......Page 122
5.2.5. Класс unique_ptr......Page 129
5.2.6. Подробное описание класса unique_ptr......Page 141
5.2.7. Класс auto_ptr......Page 144
5.2.8. Заключительные замечания об интеллектуальных указателях......Page 146
5.3. Числовые пределы......Page 147
5.4.1. Предназначение свойств типов......Page 154
5.4.2. Подробное описание свойств типов......Page 157
5.4.4. Обертки функциональных типов......Page 165
5.5.1. Вычисление минимума и максимума......Page 166
5.5.2. Обмен двух значений......Page 169
5.5.3. Вспомогательные операторы сравнения......Page 171
5.6. Арифметика рациональных чисел на этапе компиляции......Page 172
5.7.1. Обзор библиотеки Chrono......Page 176
5.7.2. Интервалы времени......Page 177
5.7.3. Часы и моменты времени......Page 182
5.7.4. Функции для работы с датами и временем в языке С и стандарте POSIX......Page 191
5.7.5. Блокировка с помощью таймеров......Page 193
5.8.1. Определения в заголовочном файле......Page 194
5.8.2. Определения в заголовочном файле......Page 195
5.8.3. Определения в заголовочном файле......Page 196
6.1. Компоненты библиотеки STL......Page 197
6.2. Контейнеры......Page 199
6.2.1. Последовательные контейнеры......Page 201
6.2.2. Ассоциативные контейнеры......Page 209
6.2.3. Неупорядоченные контейнеры......Page 213
6.2.4. Ассоциативные массивы......Page 218
6.2.5. Другие контейнеры......Page 220
6.3. Итераторы......Page 221
6.3.1. Дополнительные примеры использования ассоциативных и неупорядоченных контейнеров......Page 227
6.3.2. Категории итераторов......Page 231
6.4. Алгоритмы......Page 233
6.4.1. Диапазоны......Page 236
6.4.2. Обработка нескольких диапазонов......Page 241
6.5.1. Итераторы вставки......Page 243
6.5.2. Потоковые итераторы......Page 246
6.5.3. Обратные итераторы......Page 248
6.6. Пользовательские обобщенные функции......Page 249
6.7. Модифицирующие алгоритмы......Page 250
6.7.1. Удаление элементов......Page 251
6.7.2. Работа с ассоциативными и неупорядоченными контейнерами......Page 254
6.7.3. Алгоритмы и функции-члены......Page 255
6.8. Функции в качестве аргументов алгоритма......Page 256
6.8.1. Использование функций в качестве аргументов алгоритмов......Page 257
6.8.2. Предикаты......Page 259
6.9. Использование лямбда-выражений......Page 261
6.10.1. Определение функциональных объектов......Page 265
6.10.2. Стандартные функциональные объекты......Page 271
6.10.3. Связыватели......Page 273
6.11.1. Требования к элементам контейнеров......Page 276
6.11.2. Семантика значений и семантика ссылок......Page 277
6.12.1. Обработка ошибок......Page 278
6.12.2. Обработка исключений......Page 280
6.13.1. Интеграция дополнительных типов......Page 283
6.13.2. Наследование типов библиотеки STL......Page 284
7.1.1. Возможности контейнеров......Page 285
7.1.2. Операции над контейнерами......Page 286
7.2. Массивы......Page 293
7.2.1. Возможности массивов......Page 294
7.2.2. Операции над массивами......Page 296
7.2.3. Использование объектов array<> как массивов в стиле языка С......Page 300
7.2.6. Примеры использования массивов......Page 301
7.3. Векторы......Page 302
7.3.1. Возможности векторов......Page 303
7.3.2. Операции над векторами......Page 305
7.3.3. Использование векторов в качестве массивов языка С......Page 311
7.3.4. Обработка исключений......Page 312
7.3.5. Примеры использования векторов......Page 313
7.3.6. Класс vector......Page 315
7.4. Деки......Page 316
7.4.1. Возможности деков......Page 317
7.4.2. Операции над деком......Page 318
7.4.4. Примеры использования деков......Page 322
7.5. Списки......Page 323
7.5.1. Возможности списков......Page 324
7.5.2. Операции над списками......Page 325
7.5.3. Обработка исключений......Page 331
7.5.4. Примеры использования списков......Page 332
7.6.1. Возможности последовательных списков......Page 334
7.6.2. Операции над последовательными списками......Page 336
7.6.4. Примеры использования последовательных списков......Page 347
7.7. Множества и мультимножества......Page 349
7.7.1. Возможности множеств и мультимножеств......Page 350
7.7.2. Операции над множествами и мультимножествами......Page 351
7.7.4. Примеры использования множеств и мультимножеств......Page 361
7.7.5. Пример задания критерия сортировки во время выполнения программы......Page 364
7.8. Отображения и мультиотображения......Page 366
7.8.1. Возможности отображений и мультиотображений......Page 367
7.8.2. Операции над отображениями и мультиотображениями......Page 368
7.8.3. Использование отображений как ассоциативных массивов......Page 379
7.8.5. Примеры использования отображений и мультиотображений......Page 381
7.8.6. Пример с отображениями, строками и критериями сортировки, задаваемыми во время выполнения программы......Page 386
7.9. Неупорядоченные контейнеры......Page 389
7.9.1. Возможности неупорядоченных контейнеров......Page 391
7.9.2. Создание неупорядоченных контейнеров и управление ими......Page 395
7.9.3. Другие операции над неупорядоченными контейнерами......Page 402
7.9.4. Интерфейс сегментов......Page 409
7.9.5. Использование неупорядоченных отображений в качестве ассоциативных массивов......Page 410
7.9.7. Примеры использования неупорядоченных контейнеров......Page 411
7.10. Другие контейнеры STL......Page 420
7.10.2. Обычные массивы в стиле языка С как контейнеры STL......Page 421
Использование разделяемых указателей......Page 423
7.12. Когда и какой контейнер использовать......Page 427
8.1. Определения типов......Page 431
8.2. Операции создания, копирования и удаления......Page 434
8.3.1. Операции над размером......Page 437
8.3.2. Операции сравнения......Page 438
8.3.3. Немодифицирующие операции над ассоциативными и неупорядоченными контейнерами......Page 439
8.4. Присваивание......Page 441
8.5. Прямой доступ к элементам......Page 443
8.6. Операции генерации итераторов......Page 445
8.7.1. Вставка отдельных элементов......Page 447
8.7.2. Вставка нескольких элементов......Page 452
8.7.3. Удаление элементов......Page 454
8.8.1. Специальные функции-члены для списков (и последовательных списков)......Page 457
8.8.2. Специальные функции-члены, предназначенные только для последовательных списков......Page 461
8.9.1. Немодифицирующие вспомогательные функции......Page 465
8.9.2. Модифицирующие вспомогательные функции......Page 466
8.9.3. Сегментный интерфейс для неупорядоченных контейнеров......Page 467
8.10. Функции для выделения памяти......Page 468
8.10.2. Конструкторы для необязательных параметров распределителя памяти......Page 469
9.2.1. Итераторы вывода......Page 473
9.2.2. Итераторы ввода......Page 475
9.2.3. Однонаправленные итераторы......Page 476
9.2.5. Итераторы произвольного доступа......Page 477
9.2.6. Проблема инкремента и декремента итераторов вектора......Page 480
9.3.1. Функция advance()......Page 481
9.3.2. Функции next() и prev()......Page 483
9.3.3. Функция distance()......Page 485
9.3.4. Функция iter_swap()......Page 486
9.4. Адаптеры итераторов......Page 487
9.4.1. Обратные итераторы......Page 488
9.4.2. Итераторы вставки......Page 493
9.4.3. Итераторы потоков......Page 499
9.5. Свойства итераторов......Page 504
9.5.1. Запись обобщенных функций для итераторов......Page 506
9.6. Создание пользовательских итераторов......Page 508
10.1. Концепция функциональных объектов......Page 513
10.1.1. Функциональные объекты как критерий сортировки......Page 514
10.1.2. Функциональные объекты, имеющие внутреннее состояние......Page 515
10.1.3. Значение, возвращаемое алгоритмом for_each()......Page 519
10.1.4. Предикаты и функциональные объекты......Page 520
10.2.1. Стандартные функциональные объекты......Page 523
10.2.2. Функциональные адаптеры и привязки......Page 524
10.2.3. Пользовательские функциональные объекты для функциональных адаптеров......Page 532
10.2.4. Устаревшие функциональные адаптеры......Page 534
10.3.1. Лямбда-функции и адаптеры......Page 536
10.3.2. Лямбда-функции и функциональные объекты, имеющие состояние......Page 537
10.3.3. Лямбда-функции, вызывающие глобальные функции и функции-члены......Page 539
10.3.4. Лямбда-функции как функции-хеширования, критерий сортировки и критерий эквивалентности......Page 541
11.2. Обзор алгоритмов......Page 543
11.2.2. Классификация алгоритмов......Page 544
11.3. Вспомогательные функции......Page 556
11.4. Алгоритм for_each()......Page 558
11.5.1. Подсчет элементов......Page 562
11.5.2. Минимум и максимум......Page 564
11.5.3. Поиск элементов......Page 566
11.5.4. Сравнение диапазонов......Page 578
11.5.5. Предикаты для диапазонов......Page 585
11.6. Модифицирующие алгоритмы......Page 591
11.6.1. Копирование элементов......Page 592
11.6.2. Перемещение элементов......Page 595
11.6.3. Преобразование и объединение элементов......Page 597
11.6.4. Обмен элементов......Page 600
11.6.5. Присвоение новых значений......Page 602
11.6.6. Замена элементов......Page 605
11.7.1. Удаление определенных значений......Page 608
11.7.2. Удаление дубликатов......Page 611
11.8.1. Перестановка элементов в обратном порядке......Page 615
11.8.2. Циклическая перестановка элементов......Page 616
11.8.3. Перестановка элементов......Page 619
11.8.4. Перетасовка элементов......Page 621
11.8.5. Перемещение элементов в начало......Page 623
11.8.6. Разделение на два подынтервала......Page 625
11.9.1. Сортировка всех элементов......Page 626
11.9.2. Частичная сортировка......Page 629
11.9.3. Сортировка по n-му элементу......Page 632
11.9.4. Алгоритмы для работы с пирамидой......Page 634
11.10. Алгоритмы для упорядоченных диапазонов......Page 637
11.10.1. Поиск элементов......Page 638
11.10.2. Слияние диапазонов......Page 643
11.11.1. Вычисления......Page 651
11.11.2. Преобразования относительных и абсолютных значений......Page 655
12.1. Стеки......Page 659
12.1.1. Основной интерфейс......Page 660
12.1.2. Пример использования стеков......Page 661
12.1.3. Пользовательский класс стека......Page 662
12.2. Очереди......Page 665
12.2.2. Пример использования очереди......Page 667
12.3. Очереди с приоритетами......Page 668
12.3.2. Пример использования очереди с приоритетами......Page 670
12.3.3. Подробное описание класса priority_queue<>......Page 671
12.4.2. Конструкторы......Page 672
12.4.3. Вспомогательные конструкторы для очередей с приоритетами......Page 673
12.4.4. Операции......Page 674
12.5. Битовые множества......Page 676
12.5.1. Примеры использования битовых множеств......Page 677
12.5.2. Подробное описание класса bitset......Page 679
Изменения, внесенные в стандарте С++11......Page 681
13.1.1. Первый пример: извлечение имени временного файла......Page 682
13.1.2. Второй пример: извлечение слов и вывод их в обратном порядке......Page 686
13.2.1. Строковые типы......Page 689
13.2.2. Обзор операций......Page 692
13.2.3. Конструкторы и деструкторы......Page 694
13.2.4. Строки и С-строки......Page 695
13.2.5. Размер и емкость......Page 696
13.2.6. Доступ к элементам......Page 697
13.2.7. Сравнения......Page 699
13.2.8. Модифицирующие операции......Page 700
13.2.10. Операторы ввода-вывода......Page 703
13.2.11. Поиск......Page 705
13.2.12. Значение npos......Page 707
13.2.13. Числовые преобразования......Page 708
13.2.14. Поддержка итераторов для строк......Page 710
13.2.15. Интернационализация......Page 715
13.2.16. Производительность......Page 717
13.3.1. Определения типов и статические значения......Page 718
13.3.2. Операции создания, копирования и уничтожения......Page 720
13.3.3. Операции над размерами и емкостью......Page 721
13.3.4. Сравнения......Page 722
13.3.5. Доступ к символам......Page 724
13.3.6. Создание С-строк и массивов символов......Page 725
13.3.7. Модифицирующие операции......Page 726
13.3.8. Поиск......Page 734
13.3.9. Подстроки и конкатенация строк......Page 737
13.3.10. Функции ввода-вывода......Page 738
13.3.11. Числовые преобразования......Page 739
13.3.12. Генерация итераторов......Page 740
13.3.13. Поддержка механизмов распределения памяти......Page 741
14.1. Интерфейс сравнения и поиска регулярных выражений......Page 743
14.2. Работа с подвыражениями......Page 746
14.3. Итераторы регулярных выражений......Page 752
14.4. Итераторы токенов регулярных выражений......Page 753
14.5. Замена регулярных выражений......Page 756
14.6. Флаги регулярных выражений......Page 757
14.7. Исключения, связанные с регулярными выражениями......Page 761
14.8. Грамматика ECMAScript......Page 763
14.9. Другие грамматики......Page 765
14.10. Подробное описание основных сигнатур регулярных выражений......Page 766
Глава 15. Классы потоков ввода-вывода......Page 769
15.1.2. Классы потоков......Page 770
15.1.5. Манипуляторы......Page 771
15.1.6. Простой пример......Page 772
15.2.1. Иерархия классов......Page 773
15.2.3. Заголовочные файлы......Page 777
15.3.1. Оператор вывода <<......Page 778
15.3.3. Ввод и вывод специальных типов......Page 780
15.4.1. Константы состояния потоков......Page 783
15.4.2. Функции-члены для доступа к состоянию потоков......Page 785
15.4.3. Состояние потока и булевы условия......Page 786
15.4.4. Состояние потока и исключения......Page 788
15.5.1. Функции-члены для ввода......Page 793
15.5.2. Функции-члены для вывода......Page 797
15.5.3. Примеры использования......Page 798
15.6. Манипуляторы......Page 799
15.6.1. Обзор манипуляторов......Page 800
15.6.2. Как работают манипуляторы......Page 802
15.6.3. Пользовательские манипуляторы......Page 803
15.7.1. Флаги форматирования......Page 804
15.7.2. Формат ввода-вывода булевых значений......Page 806
15.7.3. Ширина поля, символ-заполнитель и выравнивание......Page 807
15.7.4. Положительный знак и верхний регистр......Page 809
15.7.5. Основание системы счисления......Page 810
15.7.6. Вывод чисел с плавающей точкой......Page 812
15.7.7. Общие определения формата......Page 814
15.8. Интернационализация......Page 815
15.9.1. Классы файловых потоков......Page 816
15.9.2. Rvalue и семантика перемещения для файловых потоков......Page 820
15.9.3. Флаги файлов......Page 821
15.9.4. Произвольный доступ......Page 824
15.9.5. Использование дескрипторов файлов......Page 826
15.10.1. Строковые потоковые классы......Page 827
15.10.2. Семантика перемещения для строковых потоков......Page 831
15.10.3. Потоковые классы char*......Page 832
15.11.1. Реализация операций вывода......Page 834
15.11.2. Реализация операций ввода......Page 837
15.11.3. Ввод и вывод с помощью вспомогательных функций......Page 839
15.11.4. Пользовательские флаги форматов......Page 840
15.11.5. Соглашения создания пользовательских операций ввода-вывода......Page 842
15.12.1. Нежесткое связывание с помощью функции tie()......Page 843
15.12.2. Жесткое связывание с помощью потоковых буферов......Page 844
15.12.3. Перенаправление стандартных потоков......Page 846
15.12.4. Потоки для чтения и записи......Page 848
15.13. Классы потоковых буферов......Page 849
15.13.1. Интерфейсы потоковых буферов......Page 850
15.13.2. Итераторы потоковых буферов......Page 852
15.13.3. Пользовательские потоковые буфера......Page 855
15.14.1. Синхронизация со стандартными потоками языка С......Page 867
15.14.2. Буферизация в потоковых буферах......Page 868
15.14.3. Непосредственное использование потоковых буферов......Page 869
Глава 16. Интернационализация......Page 871
16.1.1. Многобайтовый текст и текст из широких символов......Page 872
16.1.2. Разные кодировки символов......Page 873
16.1.3. Работа с кодировками в языке C++......Page 874
16.1.4. Свойства символов......Page 875
16.1.5. Интернационализация специальных символов......Page 879
16.2. Концепция локального контекста......Page 880
16.2.1. Использование локальных контекстов......Page 882
16.2.2. Фацеты......Page 887
16.3. Подробное описание объекта локального контекста......Page 890
16.4. Подробное описание фацетов......Page 892
16.4.1. Форматирование чисел......Page 893
16.4.2. Форматирование денежных величин......Page 898
16.4.3. Форматирование времени и даты......Page 907
16.4.4. Классификация и преобразование символов......Page 914
16.4.5. Сравнение строк......Page 928
16.4.6. Интернационализация сообщений......Page 929
17.1. Случайные числа и распределения......Page 931
17.1.1. Первый пример......Page 932
17.1.2. Генераторы......Page 936
17.1.3. Подробное описание генераторов......Page 939
17.1.4. Распределения......Page 941
17.1.5. Подробное описание распределений......Page 945
17.2.1. Общее описание класса complex<>......Page 949
17.2.2. Примеры использования класса complex<>......Page 950
17.2.3. Операции над комплексными числами......Page 952
17.2.4. Подробное описание класса complex<>......Page 959
17.3. Глобальные числовые функции......Page 964
17.4. Массивы значений......Page 966
Глава 18. Параллельное программирование......Page 969
18.1.1. Первый пример использования функции async() и класса future<>......Page 970
18.1.2. Пример ожидания двух задач......Page 980
18.1.3. Разделяемые фьючерсы......Page 985
18.2.1. Класс std::thread......Page 988
18.2.2. Обещания......Page 994
18.2.3. Класс packaged task<>......Page 996
18.3. Подробное описание потоков......Page 997
18.3.1. Подробное описание функции async()......Page 998
18.3.2. Подробное описание фьючерсов......Page 1000
18.3.3. Подробное описание разделяемых фьючерсов......Page 1001
18.3.4. Подробное описание класса std::promise......Page 1002
18.3.5. Подробное описание класса std::packaged_task......Page 1003
18.3.6. Подробное описание класса std::thread......Page 1005
18.3.7. Пространство имен this_thread......Page 1006
18.4.1. Осторожно, конкурентность!......Page 1007
18.4.2. Причина проблем при состязании за данные......Page 1008
18.4.3. Что именно создает опасность (расширение проблемы)......Page 1009
18.4.4. Способы решения проблем......Page 1012
18.5.1. Использование мьютексов и блокировок......Page 1014
18.5.2. Подробное описание мьютексов и блокировок......Page 1024
18.5.3. Одновременный вызов нескольких потоков......Page 1027
18.6.1. Предназначение условных переменных......Page 1029
18.6.2. Первый законченный пример использования условных переменных......Page 1030
18.6.3. Использование условных переменных для реализации очереди для нескольких потоков......Page 1032
18.6.4. Подробное описание условных переменных......Page 1035
18.7. Атомарные операции......Page 1037
18.7.1. Пример использования атомарных операций......Page 1038
18.7.2. Подробное описание атомарных типов и их низкоуровневого интерфейса......Page 1042
18.7.3. Интерфейс атомарных типов в стиле языка С......Page 1044
18.7.4. Низкоуровневый интерфейс атомарных типов......Page 1046
19.1. Использование распределителей памяти с точки зрения прикладного программиста......Page 1049
19.2. Пользовательский распределитель памяти......Page 1050
19.3. Использование распределителей памяти с точки зрения разработчика библиотеки......Page 1052
S.1. Битовые множества......Page 1057
S.1.1. Примеры использования битовых множеств......Page 1058
S.I.2. Подробное описание класса bitset<>......Page 1060
S.2. Массивы значений......Page 1067
S.2.1. Описание массивов значений......Page 1068
S.2.2. Подмножества массивов значений......Page 1074
S.2.3. Подробное описание класса valarray......Page 1088
S.2.4. Подробное описание классов подмножеств массивов значений......Page 1095
S.3. Подробное описание распределителей памяти и функций для работы с памятью......Page 1099
S.3.1. Распределители памяти с ограниченной областью видимости......Page 1100
S.3.2. Пользовательские распределители памяти в стандарте C++......Page 1101
S.3.3. Распределитель памяти по умолчанию......Page 1104
S.3.4. Подробное описание распределителей......Page 1106
S.3.5. Подробное описание утилит для работы с неинициализированной памятью......Page 1110
Книги и веб-сайты......Page 1113
Предметный указатель......Page 1119