Система Orphus

C++. Стандартная библиотека.
Для профессионалов

Автор: Джосьютис Н.
Издательство: Питер, 2004
730 страницы

Материал предоставил: Валерий Лаптев
Найти в магазинах

Аннотация

Содержание
Комментарии

Аннотация

Книга посвящена стандартной библиотеке C++, значительно расширяющей возможности базового языка. Особое внимание уделяется стандартной библиотеке шаблонов STL - ее многочисленным контейнерам, итераторам, объектам функций и алгоритмам. Также подробно описана библиотека потокового ввода/вывода IOStream и другие компоненты стандартной библиотеки C++: специализированные контейнеры, строки, поддержка математических вычислений, проблемы интернационализации и т.д. Кроме подробной документации по всем классам и интерфейсам библиотеки, в книге также разъясняются многие нетривиальные концепции, а также рассматриваются практические аспекты программирования, необходимые для эффективного использования стандартной библиотеки, и типичные ошибки. Материал поясняется многочисленными примерами. Книга может использоваться и как учебник, и как справочник. Книга рассчитана на программистов среднего и высокого уровня.

Содержание

Глава 1. О книге
Зачем написана эта книга
Что необходимо знать читателю
Стиль и структура книги
Как читать эту книгу
Текущая ситуация
От издателя перевода
Глава 2. Знакомство с C++ и стандартной библиотекой
История
Новые языковые возможности
Шаблоны
Явная инициализация базовых типов
Обработка исключений
Пространства имен
Тип bool
Ключевое слово explicit
Новые операторы преобразования типа
Инициализация константных статических членов класса
Определение main
Сложность алгоритмов
Глава 3. Общие концепции
Пространство имен std
Заголовочные файлы
Обработка ошибок и исключений
Стандартные классы исключений
Члены классов исключений
Генерирование стандартных исключений
Классы исключений, производные от exception
Распределители памяти
Глава 4. Вспомогательные средства
Пары
Парные сравнения
Вспомогательная функция make_pair
Примеры использования пар
Класс auto_ptr
Знакомство с классом auto_ptr
Передача прав владения в auto_ptr
Объекты auto_ptr как переменные классов
Неправильное использование класса auto_ptr
Примеры использования класса auto_ptr
Подробное описание класса auto_ptr
Числовые пределы
Класс numeric_limits
Пример использования класса numeric_limits
Вспомогательные функции
Вычисление минимума и максимума
Перестановка двух значений
Вспомогательные операторы сравнения
Заголовочные файлы <cstddef> и <cstdlib>
Определения <cstddef>
Определения <cstdlib>
Глава 5. Стандартная библиотека шаблонов
Компоненты STL
Контейнеры
Последовательные контейнеры
Ассоциативные контейнеры
Контейнерные адаптеры
Итераторы
Примеры использования ассоциативных контейнеров
Категории итераторов
Алгоритмы
Интервалы
Использование нескольких интервалов
Итераторные адаптеры
Итераторы вставки
Потоковые итераторы
Обратные итераторы
Модифицирующие алгоритмы
"Удаление" элементов
Модифицирующие алгоритмы и ассоциативные контейнеры
Алгоритмы и функции классов
Унифицированные пользовательские функции
Передача функций алгоритмам в качестве аргументов
Примеры передачи функций в аргументах алгоритмов
Предикаты
Объекты функций
Понятие объекта функции
Стандартные объекты функций
Элементы контейнеров
Требования к элементам контейнеров
Семантика значений и ссылочная семантика
Ошибки и исключения внутри STL
Обработка ошибок
Обработка исключений
Расширение STL
Глава 6. Контейнеры STL
Общие возможности и операции
Общие возможности контейнеров
Общие операции над контейнерами
Векторы
Возможности векторов
Операции над векторами
Векторы как обычные массивы
Обработка исключений
Примеры использования векторов
Класс vector <bool>
Деки
Возможности деков
Операции над деками
Обработка исключений
Примеры использования деков
Списки
Возможности списков
Операции над списками
Обработка исключений
Примеры использования списков
Множества и мультимножества
Возможности множеств и мультимножеств
Операции над множествами и мультимножествами
Обработка исключений
Примеры использования множеств и мультимножеств
Пример определения критерия сортировки на стадии выполнения
Отображения и мультиотображения
Возможности отображений и мультиотображений
Операции над отображениями и мультиотображениями
Отображения как ассоциативные массивы
Обработка исключений
Примеры использования отображений и мультиотображений
Пример с отображениями, строками и изменением критерия сортиров
нения
Другие контейнеры STL
Строки как контейнеры STL
Обычные массивы как контейнеры STL
Хэш-таблицы
Реализация ссылочной семантики
Рекомендации по выбору контейнера
Типы и функции контейнеров
Определения типов
Операции создания, копирования и уничтожения
Немодифицирующие операции
Присваивание
Прямой доступ к элементам
Операции получения итераторов
Вставка и удаление элементов
Специальные функции для списков
Поддержка распределителей памяти
Обработка исключений в контейнерах STL
Глава 7. Итераторы STL
Заголовочные файлы итераторов
Категории итераторов
Итераторы ввода
Итераторы вывода
Прямые итераторы
Двунаправленные итераторы
Итераторы произвольного доступа
Проблема увеличения и уменьшения итераторов в векторах
Вспомогательные функции итераторов
Перебор итераторов функцией advance
Обработка расстояния между итераторами функцией distance
Перестановка элементов функцией iter_swap
Итераторные адаптеры
Обратные итераторы
Итераторы вставки
Потоковые итераторы
Трактовка итераторов
Написание унифицированных функций для итераторов
Пользовательские итераторы
Глава 8. Объекты функций STL
Концепция объектов функций
Объект функции в качестве критерия сортировки
Объекты функций с внутренним состоянием
Возвращаемое значение алгоритма for_each
Предикаты и объекты функций
Стандартные объекты функций
Функциональные адаптеры
Функциональные адаптеры для функций классов
Функциональные адаптеры для обычных функций
Написание пользовательских объектов функциональных адаптеров
Дополнительные композиционные адаптеры
Унарные композиционные адаптеры
Бинарные композиционные адаптеры
Глава 9. Алгоритмы STL
Заголовочные файлы алгоритмов
Общий обзор алгоритмов
Введение
Классификация алгоритмов
Вспомогательные функции
Алгоритм for_each
Немодифицирующие алгоритмы
Подсчет элементов
Минимум и максимум
Поиск элементов
Сравнение интервалов
Модифицирующие алгоритмы
Копирование элементов
Преобразование и объединение элементов
Обмен интервалов
Присваивание
Замена элементов
Алгоритмы удаления
Удаление элементов с заданным значением
Удаление дубликатов
Перестановочные алгоритмы
Перестановка элементов в обратном порядке
Циклический сдвиг элементов
Перестановка элементов
Перестановка элементов в случайном порядке
Перемещение элементов в начало
Алгоритмы сортировки
Сортировка всех элементов
Частичная сортировка
Разбиение по n-му элементу
Сортировка в куче
Алгоритмы упорядоченных интервалов
Поиск элементов
Слияние интервалов
Численные алгоритмы
Обработка интервалов
Преобразования относительных и абсолютных значений
Глава 10. Специальные контейнеры
Стеки
Основной интерфейс
Пример использования стека
Строение класса stack
Пользовательская реализация стека
Очереди
Основной интерфейс
Пример использования очереди
Строение класса queue
Пользовательская реализация очереди
Приоритетные очереди
Основной интерфейс
Пример использования приоритетных очередей
Строение класса priority_queue
Битовые поля
Примеры использования битовых полей
Строение класса bitset
Глава 11. Строки
Общие сведения
Пример построения имени временного файла
Пример чтения слов и вывода символов в обратном порядке
Описание строковых классов
Строковые типы
Операции со строками
Конструкторы и деструкторы
Строки и C-строки
Размер и емкость
Обращение к символам
Операции сравнения
Модификация строк
Подстроки и конкатенация
Операторы ввода-вывода
Поиск
Значение npos
Поддержка итераторов для строк
Интернационализация
Эффективность
Строки и векторы
Строение строковых классов
Определения типов и статические значения
Операции создания, копирования и уничтожения строк
Операции с размером и емкостью
Операции сравнения
Обращение к символам
Построение C-строк и символьных массивов
Модифицирующие операции
Поиск
Выделение подстрок и конкатенация
Функции ввода-вывода
Получение итераторов
Поддержка распределителей памяти
Глава 12. Числовые типы
Комплексные числа
Примеры использования класса complex
Операции с комплексными числами
Строение класса complex
Массивы значений
Знакомство с массивами значений
Подмножества элементов в массивах значений
Строение класса valarray
Классы подмножеств элементов
Глобальные математические функции
Глава 13. Ввод-вывод с использованием потоковых классов
Общие сведения о потоках ввода-вывода
Потоковые объекты
Потоковые классы
Глобальные потоковые объекты
Потоковые операторы
Манипуляторы
Простой пример
Основные потоковые классы и объекты
Иерархия потоковых классов
Глобальные потоковые объекты
Заголовочные файлы
Стандартные операторы << и >>
Оператор вывода <<
Оператор ввода >>
Ввод-вывод специальных типов
Состояние потока данных
Константы состояния потока данных
Функции для работы с состоянием потока данных
Состояние потока данных и логические условия
Состояние потока данных и исключения
Стандартные функции ввода-вывода
Функции ввода
Функции вывода
Пример использования
Манипуляторы
Принципы работы манипуляторов
Пользовательские манипуляторы
Форматирование
Форматные флаги
Форматированный ввод-вывод логических данных
Ширина поля, заполнитель, выравнивание
Отображение знака для положительных чисел и вывод в верхнем регистре
Система счисления
Формат вещественных чисел
Общие параметры форматирования
Интернационализация
Доступ к файлам
Режимы открытия файлов
Произвольный доступ к файлам
Файловые дескрипторы
Связывание потоков ввода-вывода
Нежесткое связывание функцией tie
Жесткое связывание с использованием потоковых буферов
Перенаправление стандартных потоков данных
Потоки чтения и записи
Потоковые классы для работы со строками
Классы строковых потоков данных
Потоковые классы char*
Операторы ввода-вывода для пользовательских типов
Реализация операторов вывода
Реализация операторов ввода
Ввод-вывод с использованием вспомогательных функций
Пользовательские операторы с функциями неформатированно
Пользовательские форматные флаги
Правила построения пользовательских операторов ввода-вывода
Классы потоковых буферов
Потоковые буферы с точки зрения пользователя
Итераторы потоковых буферов
Пользовательские потоковые буферы
Проблемы эффективности
Синхронизация со стандартными потоками данных C
Буферизация в потоковых буферах
Непосредственная работа с потоковыми буферами
Глава 14. Интернационализация
Различия в кодировках символов
Расширенные и многобайтовые кодировки
Трактовки символов
Интернационализация специальных символов
Концепция локального контекста
Использование локальных контекстов
Фацеты
Строение объекта локального контекста
Строение фацетов
Числовое форматирование
Форматирование времени и даты
Форматирование денежных величин
Классификация и преобразования символов
Контекстная сортировка
Интернационализация сообщений
Глава 15. Распределители памяти
Использование распределителей в прикладном программировании
Использование распределителей при программировании библиотек
Инициализирующий итератор
Временные буферы
Распределитель по умолчанию
Пользовательский распределитель
Требования к распределителям памяти
Определения типов
Операции
Операции с неинициализированной памятью
Ресурсы Интернета
Группы Usenet
URL-адреса
Библиография
Алфавитный указатель

Комментарии

Валерий Лаптев

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

Не знаю почему, но я уже не раз сталкивался с тем, что авторы западных книг сначала описывают "новые языковые возможности", хотя они давно уже не новые. Видимо, это как раз те разделы стандарта, которые были приняты последними, поэтому не успели "войти" в компиляторы. Не стала исключением и книга Джосаттиса. Конкретно именно в этой книге наличие таких глав полезно для новичков. Написано без излишних формальностей и подробностей, но достаточно, чтобы получить представление об этих свойствах С++. Тот, кто все это знает, может без ущерба для себя пропустить. Я, например, всегда стараюсь такие главы читать, так как разные авторы по-разному преподносят известный материал, иногда с неожиданной точки зрения.

Очень полезна глава 4, где излагается практически полное описание auto_ptr, и использование numeric_limits, чего в других книжках мне как-то не попадалось. Пятая глава - очень хороший обзор всей STL. Во всяком случае, лучшего обзора я не читал. Начиная с шестой - подробнейшее описание конкретных вещей. Опять же, более подробного и обстоятельного изложения на русском языке я раньше не видел. Все контейнеры описаны по единой схеме: возможности, операции, обработка исключений, примеры использования. Во многих случаях есть дополнительные разделы. Джосаттис не ограничивается просто описанием стандартной "канонической" библиотеки - в книге приводятся рекомендации по использованию. В главе о контейнерах автор описывает еще и интерфейсный класс-адаптер для массива вроде того, что он включил в состав библиотеки boost. Там же есть небольшая, но очень полезная глава, где рассматривается семантика ссылок и приводится класс интеллектуального указателя.

Много фактической справочной информации. Причем изложение построено таким образом, что сначала описывается как бы введение в нужную тему, а после того, как читатель "въехал", дается фактическая справочная информация. В тексте много примеров и часто после них приводится описание интерфейса нужных классов и методов. Очень хороши главы про строки и ввод-вывод. Лично мне особенно понравилась глава о вводе-выводе - нигде не встречал я более подробного изложения. Написано, например, как реализовать собственный манипулятор, как связывать потоки для гарантии последовательности вывода. Уделено внимание и эффективности.

Мы как-то забыли (или просто не знали?), что комплексные числа входят в стандартную библиотеку. А кроме того, еще и массивы значений valarray. Кроме книги Страуструпа, который фактически только упоминает об этом, мне больше нигде не встречалось описание этих классов. Кроме того, Джосаттис описывает еще и локали (глава 14 - Интернационализация) и аллокаторы. Я в этих вопросах пока не очень просвещен, поэтому книга Джосаттиса в этих вопросах мне как раз кстати. В общем, книга содержит все, что на данный момент есть в STL.

Не знаю, то ли Джосаттис пишет просто о сложных вещах, то ли переводчики внесли свою посильную лепту (наверное, и то и другое понемногу), но стиль изложения очень хорош - мне очень нравится. Явных, бросающихся в глаза ляпов перевода я тоже не обнаружил. Понравилось, например, что вместо жаргонизмов "привязки" и "отрицатели" (которые я впервые обнаружил в книге Аммерааля) используется вполне профессиональный термин "функциональный адаптер".

Книга издана качественно, в серии "Для профессионалов" - и своему назначению соответствует.