- •Часть I
- •1. Начинаем
- •1.1. Решение задачи
- •1.2.1. Порядок выполнения инструкций
- •1.3. Директивы препроцессора
- •1.4. Немного о комментариях
- •1.5. Первый взгляд на ввод/вывод
- •1.5.1. Файловый ввод/вывод
- •2.1. Встроенный тип данных “массив”
- •2.2. Динамическое выделение памяти и указатели
- •2.3. Объектный подход
- •2.4. Объектно-ориентированный подход
- •2.5. Использование шаблонов
- •2.6. Использование исключений
- •2.7. Использование пространства имен
- •2.8. Стандартный массив – это вектор
- •Часть II
- •3.1. Литералы
- •3.2. Переменные
- •3.2.1. Что такое переменная
- •3.2.2. Имя переменной
- •3.2.3. Определение объекта
- •3.3. Указатели
- •3.4. Строковые типы
- •3.4.1. Встроенный строковый тип
- •3.4.2. Класс string
- •3.5. Спецификатор const
- •3.6. Ссылочный тип
- •3.8. Перечисления
- •3.9. Тип “массив”
- •3.9.1. Многомерные массивы
- •3.9.2. Взаимосвязь массивов и указателей
- •3.10. Класс vector
- •3.11. Класс complex
- •3.12. Директива typedef
- •3.13. Спецификатор volatile
- •3.14. Класс pair
- •3.15. Типы классов
- •4. Выражения
- •4.1. Что такое выражение?
- •4.2. Арифметические операции
- •4.3. Операции сравнения и логические операции
- •4.4. Операции присваивания
- •4.5. Операции инкремента и декремента
- •4.6. Операции с комплексными числами
- •4.7. Условное выражение
- •4.8. Оператор sizeof
- •4.9. Операторы new и delete
- •4.10. Оператор “запятая”
- •4.11. Побитовые операторы
- •4.12. Класс bitset
- •4.13. Приоритеты
- •4.14. Преобразования типов
- •4.14.1. Неявное преобразование типов
- •4.14.2. Арифметические преобразования типов
- •4.14.3. Явное преобразование типов
- •4.14.4. Устаревшая форма явного преобразования
- •4.15. Пример: реализация класса Stack
- •5. Инструкции
- •5.1. Простые и составные инструкции
- •5.2. Инструкции объявления
- •5.3. Инструкция if
- •5.4. Инструкция switch
- •5.5. Инструкция цикла for
- •5.6. Инструкция while
- •5.8. Инструкция do while
- •5.8. Инструкция break
- •5.9. Инструкция continue
- •5.10. Инструкция goto
- •5.11. Пример связанного списка
- •5.11.1. Обобщенный список
- •6. Абстрактные контейнерные типы
- •6.1. Система текстового поиска
- •6.2. Вектор или список?
- •6.3. Как растет вектор?
- •6.4. Как определить последовательный контейнер?
- •6.5. Итераторы
- •6.6. Операции с последовательными контейнерами
- •6.6.1. Удаление
- •6.6.2. Присваивание и обмен
- •6.6.3. Обобщенные алгоритмы
- •6.7. Читаем текстовый файл
- •6.8. Выделяем слова в строке
- •6.9. Обрабатываем знаки препинания
- •6.10. Приводим слова к стандартной форме
- •6.11. Дополнительные операции со строками
- •6.12. Строим отображение позиций слов
- •6.12.1. Определение объекта map и заполнение его элементами
- •6.12.2. Поиск и извлечение элемента отображения
- •6.12.3. Навигация по элементам отображения
- •6.12.4. Словарь
- •6.12.5. Удаление элементов map
- •6.13. Построение набора стоп-слов
- •6.13.1. Определение объекта set и заполнение его элементами
- •6.13.2. Поиск элемента
- •6.13.3. Навигация по множеству
- •6.14. Окончательная программа
- •6.15. Контейнеры multimap и multiset
- •6.16. Стек
- •6.17. Очередь и очередь с приоритетами
- •6.18. Вернемся в классу iStack
- •Часть III
- •7. Функции
- •7.1. Введение
- •7.2. Прототип функции
- •7.2.1. Тип возвращаемого функцией значения
- •7.2.2. Список параметров функции
- •7.2.3. Проверка типов формальных параметров
- •7.3. Передача аргументов
- •7.3.1. Параметры-ссылки
- •7.3.2. Параметры-ссылки и параметры-указатели
- •7.3.3. Параметры-массивы
- •7.3.4. Абстрактные контейнерные типы в качестве параметров
- •7.3.5. Значения параметров по умолчанию
- •7.3.6. Многоточие
- •7.4. Возврат значения
- •7.4.1. Передача данных через параметры и через глобальные объекты
- •7.5. Рекурсия
- •7.6. Встроенные функции
- •7.7. Директива связывания extern "c" a
- •7.8. Функция main(): разбор параметров командной строки
- •7.8.1. Класс для обработки параметров командной строки
- •7.9. Указатели на функции
- •7.9.1. Тип указателя на функцию
- •7.9.2. Инициализация и присваивание
- •7.9.3. Вызов
- •7.9.4. Массивы указателей на функции
- •7.9.5. Параметры и тип возврата
- •7.9.6. Указатели на функции, объявленные как extern "c"
- •8. Область видимости и время жизни
- •8.1. Область видимости
- •8.1.1. Локальная область видимости
- •8.2. Глобальные объекты и функции
- •8.2.1. Объявления и определения
- •8.2.2. Сопоставление объявлений в разных файлах
- •8.2.3. Несколько слов о заголовочных файлах
- •8.3. Локальные объекты
- •8.3.1. Автоматические объекты
- •8.3.2. Регистровые автоматические объекты
- •8.3.3. Статические локальные объекты
- •8.4. Динамически размещаемые объекты
- •8.4.1. Динамическое создание и уничтожение единичных объектов
- •8.4.2. Шаблон auto_ptr а
- •8.4.3. Динамическое создание и уничтожение массивов
- •8.4.4. Динамическое создание и уничтожение константных объектов
- •8.4.5. Оператор размещения new а
- •8.5. Определения пространства имен а
- •8.5.1. Определения пространства имен
- •8.5.2. Оператор разрешения области видимости
- •8.5.3. Вложенные пространства имен
- •8.5.4. Определение члена пространства имен
- •8.5.5. Поо и члены пространства имен
- •8.5.6. Безымянные пространства имен
- •8.6. Использование членов пространства имен а
- •8.6.1. Псевдонимы пространства имен
- •8.6.2. Using-объявления
- •8.6.3. Using-директивы
- •8.6.4. Стандартное пространство имен std
- •9. Перегруженные функции
- •9.1. Объявления перегруженных функций
- •9.1.1. Зачем нужно перегружать имя функции
- •9.1.2. Как перегрузить имя функции
- •9.1.3. Когда не надо перегружать имя функции
- •9.1.4. Перегрузка и область видимости a
- •9.1.5. Директива extern "c" и перегруженные функции a
- •9.1.6. Указатели на перегруженные функции a
- •9.1.7. Безопасное связывание a
- •9.2. Три шага разрешения перегрузки
- •9.3. Преобразования типов аргументов a
- •9.3.1. Подробнее о точном соответствии
- •9.3.2. Подробнее о расширении типов
- •9.3.3. Подробнее о стандартном преобразовании
- •9.3.4. Ссылки
- •9.4. Детали разрешения перегрузки функций
- •9.4.1. Функции-кандидаты
- •9.4.2. Устоявшие функции
- •9.4.3. Наилучшая из устоявших функция
- •9.4.4. Аргументы со значениями по умолчанию
- •10. Шаблоны функций
- •10.1. Определение шаблона функции
- •10.2. Конкретизация шаблона функции
- •10.3. Вывод аргументов шаблона а
- •10.4. Явное задание аргументов шаблона a
- •10.5. Модели компиляции шаблонов а
- •10.5.1. Модель компиляции с включением
- •10.5.2. Модель компиляции с разделением
- •10.5.3. Явные объявления конкретизации
- •10.6. Явная специализация шаблона а
- •10.7. Перегрузка шаблонов функций а
- •10.8. Разрешение перегрузки при конкретизации a
- •10.9. Разрешение имен в определениях шаблонов а
- •10.10. Пространства имен и шаблоны функций а
- •10.11. Пример шаблона функции
- •11. Обработка исключений
- •11.1. Возбуждение исключения
- •11.3. Перехват исключений
- •11.3.1. Объекты-исключения
- •11.3.2. Раскрутка стека
- •11.3.3. Повторное возбуждение исключения
- •11.3.4. Перехват всех исключений
- •11.4. Спецификации исключений
- •11.4.1. Спецификации исключений и указатели на функции
- •11.5. Исключения и вопросы проектирования
- •12. Обобщенные алгоритмы
- •12.1. Краткий обзор
- •12.2. Использование обобщенных алгоритмов
- •12.3. Объекты-функции
- •12.3.1. Предопределенные объекты-функции
- •12.3.2. Арифметические объекты-функции
- •12.3.3. Сравнительные объекты-функции
- •12.3.4. Логические объекты-функции
- •12.3.5. Адаптеры функций для объектов-функций
- •12.3.6. Реализация объекта-функции
- •12.4. Еще раз об итераторах
- •12.4.1. Итераторы вставки
- •12.4.2. Обратные итераторы
- •12.4.3. Потоковые итераторы
- •12.4.4. Итератор istream_iterator
- •12.4.5. Итератор ostream_iterator
- •12.4.6. Пять категорий итераторов
- •12.5. Обобщенные алгоритмы
- •12.5.1. Алгоритмы поиска
- •12.5.2. Алгоритмы сортировки и упорядочения
- •12.5.3. Алгоритмы удаления и подстановки
- •12.5.4. Алгоритмы перестановки
- •12.5.9. Алгоритмы работы с хипом
- •12.6. Когда нельзя использовать обобщенные алгоритмы
- •12.6.1. Операция list_merge()
- •12.6.2. Операция list::remove()
- •12.6.3. Операция list::remove_if()
- •12.6.4. Операция list::reverse()
- •12.6.5. Операция list::sort()
- •12.6.6. Операция list::splice()
- •12.6.7. Операция list::unique()
- •Часть IV
- •13. Классы
- •13.1. Определение класса
- •13.1.1. Данные-члены
- •13.1.2. Функции-члены
- •13.1.3. Доступ к членам
- •13.1.4. Друзья
- •13.1.5. Объявление и определение класса
- •13.2. Объекты классов
- •13.3. Функции-члены класса
- •13.3.1. Когда использовать встроенные функции-члены
- •13.3.2. Доступ к членам класса
- •13.3.3. Закрытые и открытые функции-члены
- •13.3.4. Специальные функции-члены
- •13.3.5. Функции-члены со спецификаторами const и volatile
- •13.3.6. Объявление mutable
- •13.4. Неявный указатель this
- •13.4.1. Когда использовать указатель this
- •13.5. Статические члены класса
- •13.5.1. Статические функции-члены
- •13.6. Указатель на член класса
- •13.6.1. Тип члена класса
- •13.6.2. Работа с указателями на члены класса
- •13.6.3. Указатели на статические члены класса
- •13.7. Объединение – класс, экономящий память
- •13.8. Битовое поле – член, экономящий память
- •13.9. Область видимости класса a
- •13.9.1. Разрешение имен в области видимости класса
- •13.10. Вложенные классы a
- •13.10.1. Разрешение имен в области видимости вложенного класса
- •13.11. Классы как члены пространства имен a
- •13.12. Локальные классы a
- •14. Инициализация, присваивание и уничтожение класса
- •14.1. Инициализация класса
- •14.2. Конструктор класса
- •14.2.1. Конструктор по умолчанию
- •14.2.2. Ограничение прав на создание объекта
- •14.2.3. Копирующий конструктор
- •14.3. Деструктор класса
- •14.3.1. Явный вызов деструктора
- •14.3.2. Опасность увеличения размера программы
- •14.4. Массивы и векторы объектов
- •14.4.1. Инициализация массива, распределенного из хипа a
- •14.4.2. Вектор объектов
- •14.5. Список инициализации членов
- •14.6. Почленная инициализация a
- •14.6.1. Инициализация члена, являющегося объектом класса
- •14.7. Почленное присваивание a
- •14.8. Соображения эффективности a
- •15. Перегруженные операторы и определенные пользователем преобразования
- •15.1. Перегрузка операторов
- •15.1.1. Члены и не члены класса
- •15.1.2. Имена перегруженных операторов
- •15.1.3. Разработка перегруженных операторов
- •15.2. Друзья
- •15.4. Оператор взятия индекса
- •15.5. Оператор вызова функции
- •15.6. Оператор “стрелка”
- •15.7. Операторы инкремента и декремента
- •15.8. Операторы new и delete
- •15.8.1. Операторы new[ ] и delete [ ]
- •15.8.2. Оператор размещения new() и оператор delete()
- •15.9. Определенные пользователем преобразования
- •15.9.1. Конвертеры
- •15.9.2. Конструктор как конвертер
- •15.10. Выбор преобразования a
- •15.10.1. Еще раз о разрешении перегрузки функций
- •15.10.2. Функции-кандидаты
- •15.10.3. Функции-кандидаты для вызова функции в области видимости класса
- •15.10.4. Ранжирование последовательностей определенных пользователем преобразований
- •15.11. Разрешение перегрузки и функции-члены a
- •15.11.1. Объявления перегруженных функций-членов
- •15.11.2. Функции-кандидаты
- •15.11.3. Устоявшие функции
- •15.12. Разрешение перегрузки и операторы a
- •15.12.1. Операторные функции-кандидаты
- •15.12.2. Устоявшие функции
- •15.12.3. Неоднозначность
- •16. Шаблоны классов
- •16.1. Определение шаблона класса
- •16.1.1. Определения шаблонов классов Queue и QueueItem
- •16.2. Конкретизация шаблона класса
- •16.2.1. Аргументы шаблона для параметров-констант
- •16.3. Функции-члены шаблонов классов
- •16.3.1. Функции-члены шаблонов Queue и QueueItem
- •16.4. Объявления друзей в шаблонах классов
- •16.4.1. Объявления друзей в шаблонах Queue и QueueItem
- •16.5. Статические члены шаблонов класса
- •16.6. Вложенные типы шаблонов классов
- •16.7. Шаблоны-члены
- •16.8. Шаблоны классов и модель компиляции a
- •16.8.1. Модель компиляции с включением
- •16.8.2. Модель компиляции с разделением
- •16.8.3. Явные объявления конкретизации
- •16.9. Специализации шаблонов классов a
- •16.10. Частичные специализации шаблонов классов a
- •16.11. Разрешение имен в шаблонах классов a
- •16.12. Пространства имен и шаблоны классов
- •16.13. Шаблон класса Array
- •Часть V
- •17. Наследование и подтипизация классов
- •17.1. Определение иерархии классов
- •17.1.1. Объектно-ориентированное проектирование
- •17.2. Идентификация членов иерархии
- •17.2.1. Определение базового класса
- •17.2.2. Определение производных классов
- •17.2.3. Резюме
- •17.3. Доступ к членам базового класса
- •17.4. Конструирование базового и производного классов
- •17.4.1. Конструктор базового класса
- •17.4.2. Конструктор производного класса
- •17.4.3. Альтернативная иерархия классов
- •17.4.4. Отложенное обнаружение ошибок
- •17.4.5. Деструкторы
- •17.5. Виртуальные функции в базовом и производном классах
- •17.5.1. Виртуальный ввод/вывод
- •17.5.2. Чисто виртуальные функции
- •17.5.3. Статический вызов виртуальной функции
- •17.5.4. Виртуальные функции и аргументы по умолчанию
- •17.5.5. Виртуальные деструкторы
- •17.5.6. Виртуальная функция eval()
- •17.5.7. Почти виртуальный оператор new
- •17.5.8. Виртуальные функции, конструкторы и деструкторы
- •17.6. Почленная инициализация и присваивание a
- •17.7. Управляющий класс UserQuery
- •17.7.1. Определение класса UserQuery
- •17.8. Соберем все вместе
- •18. Множественное и виртуальное наследование
- •18.1. Готовим сцену
- •18.2. Множественное наследование
- •18.3. Открытое, закрытое и защищенное наследование
- •18.3.1. Наследование и композиция
- •18.3.2. Открытие отдельных членов
- •18.3.3. Защищенное наследование
- •18.3.4. Композиция объектов
- •18.4. Область видимости класса и наследование
- •18.4.1. Область видимости класса при множественном наследовании
- •18.5. Виртуальное наследование a
- •18.5.1. Объявление виртуального базового класса
- •18.5.2. Специальная семантика инициализации
- •18.5.3. Порядок вызова конструкторов и деструкторов
- •18.5.4. Видимость членов виртуального базового класса
- •18.6. Пример множественного виртуального наследования a
- •18.6.1. Порождение класса, контролирующего выход за границы массива
- •18.6.2. Порождение класса отсортированного массива
- •18.6.3. Класс массива с множественным наследованием
- •19.1. Идентификация типов во время выполнения
- •19.1.1. Оператор dynamic_cast
- •19.1.2. Оператор typeid
- •19.1.3. Класс type_info
- •19.2. Исключения и наследование
- •19.2.1. Исключения, определенные как иерархии классов
- •19.2.2. Возбуждение исключения типа класса
- •19.2.3. Обработка исключения типа класса
- •19.2.4. Объекты-исключения и виртуальные функции
- •19.2.5. Раскрутка стека и вызов деструкторов
- •19.2.6. Спецификации исключений
- •19.2.7. Конструкторы и функциональные try-блоки
- •19.3. Разрешение перегрузки и наследование a
- •19.3.1. Функции-кандидаты
- •19.3.2. Устоявшие функции и последовательности пользовательских преобразований
- •19.3.3. Наилучшая из устоявших функций
- •20. Библиотека iostream
- •20.2. Ввод
- •20.2.1. Строковый ввод
- •20.3. Дополнительные операторы ввода/вывода
- •20.4. Перегрузка оператора вывода
- •20.5. Перегрузка оператора ввода
- •20.6. Файловый ввод/вывод
- •20.7. Состояния потока
- •20.8. Строковые потоки
- •20.9. Состояние формата
- •20.10. Сильно типизированная библиотека
- •21. Обобщенные алгоритмы в алфавитном порядке
- •Алгоритм accumulate()
- •Алгоритм adjacent_difference()
- •Алгоритм adjacent_find()
- •Алгоритм binary_search()
- •Алгоритм copy()
- •Алгоритм copy_backward()
- •Алгоритм count()
- •Алгоритм count_if()
- •Алгоритм equal()
- •Алгоритм equal_range()
- •Алгоритм fill()
- •Алгоритм fill_n()
- •Алгоритм find()
- •Алгоритм find_if()
- •Алгоритм find_end()
- •Алгоритм find_first_of()
- •Алгоритм for_each()
- •Алгоритм generate()
- •Алгоритм generate_n()
- •Алгоритм includes()
- •Алгоритм inner_product()
- •Алгоритм inplace_merge()
- •Алгоритм iter_swap()
- •Алгоритм lexicographical_compare()
- •Алгоритм lower_bound()
- •Алгоритм max()
- •Алгоритм max_element()
- •Алгоритм min()
- •Алгоритм min_element()
- •Алгоритм merge()
- •Алгоритм mismatch()
- •Алгоритм next_permutation()
- •Алгоритм nth_element()
- •Алгоритм partial_sort()
- •Алгоритм partial_sort_copy()
- •Алгоритм partial_sum()
- •Алгоритм partition()
- •Алгоритм prev_permutation()
- •Алгоритм random_shuffle()
- •Алгоритм remove()
- •Алгоритм remove_copy()
- •Алгоритм remove_if()
- •Алгоритм remove_copy_if()
- •Алгоритм replace()
- •Алгоритм replace_copy()
- •Алгоритм replace_if()
- •Алгоритм replace_copy_if()
- •Алгоритм reverse()
- •Алгоритм reverse_copy()
- •Алгоритм rotate()
- •Алгоритм rotate_copy()
- •Алгоритм search()
- •Алгоритм search_n()
- •Алгоритм set_difference()
- •Алгоритм set_intersection()
- •Алгоритм set_symmetric_difference()
- •Алгоритм set_union()
- •Алгоритм sort()
- •Алгоритм stable_partition()
- •Алгоритм stable_sort()
- •Алгоритм swap()
- •Алгоритм swap_ranges()
- •Алгоритм transform()
- •Алгоритм unique()
- •Алгоритм unique_copy()
- •Алгоритм upper_bound()
- •Алгоритмы для работы с хипом
- •Алгоритм make_heap()
- •Алгоритм pop_heap()
- •Алгоритм push_heap()
- •Алгоритм sort_heap()
Алгоритм push_heap()
template< class RandomAccessIterator >
void
push_heap( RandomAccessIterator first,
RandomAccessIterator last );
template< class RandomAccessIterator, class Compare >
void
push_heap( RandomAccessIterator first,
RandomAccessIterator last, Compare comp );
push_heap() предполагает, что последовательность, ограниченная диапазоном [first,last-1), – хип и что новый добавляемый к хипу элемент находится в позиции last-1. Все элементы в диапазоне [first,last) реорганизуются в новый хип. Перед вызовом push_heap() необходимо вставить новый элемент в конец контейнера, возможно, применив функцию push_back() (это показано в примере ниже). В первом варианте при сравнении используется оператор “меньше”, определенный для типа элементов контейнера; во втором – операция comp.
Алгоритм sort_heap()
template< class RandomAccessIterator >
void
sort_heap( RandomAccessIterator first,
RandomAccessIterator last );
template< class RandomAccessIterator, class Compare >
void
sort_heap( RandomAccessIterator first,
RandomAccessIterator last, Compare comp );
sort_heap() сортирует последовательность в диапазоне [first,last), предполагая, что это правильно построенный хип; в противном случае поведение программы не определено. (Разумеется, после сортировки хип перестает быть хипом!) В первом варианте при сравнении используется оператор “меньше”, определенный для типа элементов контейнера, а во втором – операция comp.
#include <algorithm>
#include <vector>
#include <assert.h>
template <class Type>
void print_elements( Type elem ) { cout << elem << " "; }
int main()
{
int ia[] = { 29,23,20,22,17,15,26,51,19,12,35,40 };
vector< int, allocator > vec( ia, ia+12 );
// печатается: 51 35 40 23 29 20 26 22 19 12 17 15
make_heap( &ia[0], &ia[12] );
void (*pfi)( int ) = print_elements;
for_each( ia, ia+12, pfi ); cout << "\n\n";
// печатается: 12 17 15 19 23 20 26 51 22 29 35 40
// минимальный хип: в корне наименьший элемент
make_heap( vec.begin(), vec.end(), greater<int>() );
for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n";
// печатается: 12 15 17 19 20 22 23 26 29 35 40 51
sort_heap( ia, ia+12 );
for_each( ia, ia+12, pfi ); cout << "\n\n";
// добавим новый наименьший элемент
vec.push_back( 8 );
// печатается: 8 17 12 19 23 15 26 51 22 29 35 40 20
// новый наименьший элемент должен оказаться в корне
push_heap( vec.begin(), vec.end(), greater<int>() );
for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n";
// печатается: 12 17 15 19 23 20 26 51 22 29 35 40 8
// наименьший элемент должен быть заменен на следующий по порядку
pop_heap( vec.begin(), vec.end(), greater<int>() );
for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n";
}
A
abort(), функция
вызов из terminate() как подразумеваемое поведение 423
abs(), функция
поддержка для комплексных чисел 131
accumulate(), обобщенный алгоритм 841
adjacent_difference(), обобщенный алгоритм 842
adjacent_find(), обобщенный алгоритм 843
algorithm, заголовочный файл 455
any(), функция
в классе bitset 140
append(), функция
конкатенация строк 231
argc, переменная
счетчик аргументов в командной строке 283
argv, массив
для доступа к аргументам в командной строке 283
assert(), макрос 47
at(), функция
контроль выхода за границы диапазона во время выполнения 232
atoi(), функция
применение для обработки аргументов в командной строке 286
auto_ptr, шаблон класса 319
подводные камни 319
aункции
интерфейс
включение объявления исключений в 426
B
back_inserter(), адаптор функции
использование в операции вставки push_back() 449
back(), функция
поддержка очереди 253
begin(), функция
итератор
возврат с помощью 449
binary_search(), обобщенный алгоритм 844
bind1st(), адаптор функции 446
bitset, класс
test(), функция 140
to_long(), функция 143
to_string(), функция 142
заголовочный файл bitset 141
оператор доступа к биту ([]) 140
операции 143
break 178
break, инструкция
сравнение с инструкцией return 275
C
C_str(), функция
преобразование объектов класса string в C-строки 116
C, язык
символьные строки
динамическое выделение памяти для 320
необходимость доступа из класса string 110
C++, язык
std, пространство имен 340
введение в (глава) 13
компоненты
типы данных (глава) 118
предопределенные операторы (таблица) 555
catch-обработчик 56, 417, 419
критерий выбора 57
универсальный обработчик 426
cerr 25
представление стандартного вывода для ошибок с помощью 791
char *, указатель
работы с C-строками символов 83
char, тип 69
check_range(), пример функции
как закрытая функция-член 47
cin 25
использование итератора istream_iterator 451
представление стандартного ввода с помощью 791
class, ключевое слово
typename как синоним 377
использование в определении класса 463
использование в определении шаблона класса 610
использование в параметрах-типах шаблона
класса 610
функции 375
const, квалификатор
вопросы разрешения перезагрузки функций
ранжирование преобразований, связанных с инициализацией ссылочных параметров 372
константные объекты, динамическое выделение и освобождение памяти 322
константные параметры
параметры-ссылки с квалификатором const 264, 271
передача массива из константных элементов 268
контейнеры, необходимость константного итератора 448
преобразование объектов в константы 90
сравнение с volatile 109
ссылка, инициализация объектом другого типа 94
указатели на константные объекты 91
copy(), обобщенный алгоритм 844
использование класса inserter 244
count_if(), обобщенный алгоритм 849
count(), обобщенный алгоритм 846
использование istream_iterator и ostream_iterator 452
использование с множествами 245
count(), функция
в классе bitset 140
cout 25
представление стандартного вывода с помощью 791
cпецификации
исключений
для документирования исключений 426
D
delete, оператор 33, 136
безопасное и небезопасное использование, примеры 315
для массивов
объектов класса 573
для одиночного объекта 313
deque (двустороння очередь, дека)
как последовательный контейнер 255
применение для реализации стека 251
do-while, инструкция 178
сравнение с инструкциями for и while 172
E
end(), функция
итератор, использование 211
endl, манипулятор потока iostream 25
equal_range(), обобщенный алгоритм
использование с контейнерами multimap и multiset 249
extern \ 299, 348, 349
extern, ключевое слово
использование с членами пространства имен 332
как директива связывания 282
объявление
константы 308
объявления объектов
без определения 305
размещение в заголовочном файле 306
F
f, суффикс
нотация для литерала с плавающей точкой одинарной точности 70
find_first_of(), обобщенный алгоритм
нахождение знаков препинания 225
нахождение первого символа в строке 221
find_last_ of() 224
find_last_not_of() 224
find(), обобщенный алгоритм
поиск подстроки 220
поиск элемента отображения 238
for, инструкция 174
использование с инструкцией if 163
front_inserter(), адаптор функции
использование в операции push_front() 449
front(), функция
поддержка очереди 253
fstream, класс
файловый ввод / вывод 792
full(), функция
модификация алгоритма динамического роста стека 254
G
getline(), функция 217, 814
goto, инструкция 181
greater_equal, объект-функция 445
greater, объект-функция 445
I
if, инструкция 166
If, инструкция
условный оператор как альтернатива 132
insert(), функция
вставка символов в строку 230
реализация 214
списки 181
inserter, класс 244
inserter(), адаптор функции
для вставки с помощью insert() 449
iostream библиотека
iostream.h, заголовочный файл, пример использования 439
ввод
istream_iterator 451
итераторы 453
манипуляторы
endl 25
операторы, сцепление 25
isalpha(), функция 170
ctype, заголовочный файл 228
isdigit(), функция
ctype, заголовочный файл 228
ispunct(), функция
ctype, заголовочный файл 228
isspace(), функция
ctype, заголовочный файл 228
istream_iterator 452
L
l-значение 74
как возвращаемое значение, подводные камни 277
оператор присваивания, требования 126
преобразования 354
преобразование точного соответствия 353
точное соответствие при разрешении перегрузки функций 361
трансформация 356, 368
less_equal, объект-функция 445
less, объект-функция 445
M
main() 15
map, заголовочный файл
использование с контейнером multimap 248
merge(), обобщенный алгоритм
специализированная версия для спискаов 458
modulus, объект-функция 444
multimap (мультиотображение), контейнер 250
multiplies, объект-функция 444
N
negate, объект-функция 444
new оператор
для константных объектов 323
для объектов классов 569
использование класса распределителя памяти (сноска) 208
not_equal_to, объект-функция
(код) 445
not2(), адаптор функции
как адаптор-отрицатель 446
numeric, заголовочный файл 455
использование численных обобщенных алгоритмов 457
O
ofstream, тип 827
P
pair, класс 109
plus, объект-функция 443, 444
pop_back(), функция
использование для реализации динамического роста стека 254
push_back(), функция
поддержка в контейнерах 209
стеки, использования для динамического выделения памяти 254
push_front(), функция
поддержка в списковых контейнерах 209
R
r-значение 74
использование при вычислении выражений 119
release()б функция
управление объектами с помощью класса auto_ptr 319
reserve(), функция
использование для установки емкости контейнера 207
reset(), функция
установка указателя auto_ptr 318
resize(), функция
использование для изменения размера контейнера 209
return, инструкция
сравнение с выражением throw 415
S
sort(), обобщенный алгоритм
вызов 104
передача объекта=функции в качестве аргумента 443
stack, заголовочный файл 250
static_cast, оператор
опасности 152
string, заголовочный файл 60
string, строковый тип 88
substr(), функция 222
пустая строка 86
смешение объектов типа string и C-строк 87
switch, инструкция 171
использование ключевого слова default 167, 169
T
this, указатель 481
tolower(), функция
преобразование заглавных букв в строчные 228
toupper(), функция
ctype, заголовочный файл 228
locale, заголовочный файл 228
true, ключевое слово 96
typedef
для улучшения читабельности 294
как синоним существующего имени типа 343
массива указателей на функции 294
typename 196
использование с параметрами шаблона функции 377
U
unexpected(), функция
для обработки нераспознанных исключений 426
unique_copy(), обобщенный алгоритм
запись целых чисел из вектора в стандартный вывод 450
unique(), обобщенный алгоритм
удаление дубликатов из вектора 435
using-директивы
влияние на разрешение перегрузки функции 365
using-объявления 336
влияние на разрешение перегрузки функции 364
для объявления перегруженных функций 346
сравнение с using-директивами 339
V
vector, заголовочный файл 63
void
в списке параметров функции 259
void*
преобразование в void* как стандартное преобразование 360
volatile, квалификатор 109
для типа параметра, в связи с перегрузкой функций 343
использование преобразования квалификаторов 370
W
while, инструкция 176
сравнение с инструкциями for и do-while 172
символы
& (амперсанд)
оператор взятия адреса:использование в определении ссылки 93
&& (двойной амперсанд)
оператор логического И 123
шаблон класса Array
Array_RC, производный класс 756
#
#include, директива
использование с using-директивой 61, 339
использование с директивой связывания 281
а
абстракция
объекта, класс комплексных чисел как пример 129
стандартная библиотека, преимущества использования 138
автоматические объекты
объявление с ключевым словом register 311
особенности хранения 310
адапторы
функций, для объектов-функций 446
адрес(а)
как значение указателя 79
конкретизированных шаблонов функций 380
алгоритм(ы)
функция
выведение аргумента шаблона 383
разрешение перегрузки 400
шаблон как 374
аргумент(ы) 257
передача 275
использование указателей для 78
передача по значению 262
по умолчанию
и виртуальные функции 692
и устоявшие функции 372
тип
преобразования, разрешение перегрузки функции 362
преобразования, расширение типа 358
преобразования, ссылок 362
преобразования, стандартные 360
шаблона класса
для параметров-констант 615
для параметров-типов 615
шаблонов функции
явные 386
шаблонов функций
выведение аргументов 384
явная спецификация, мотивировка 386
явная спецификация, недостатки 386
арифметические
исключения 121
объекты-функции 444
операторы 122
таблица 120
операции, поддержка для комплексных чисел 108
преобразования 147, 150
bool в int 96
неявное выполнение при вычислении выражений 147
типов, расширение типа перечисления 98
указатели 81
ассоциативность
операторов, влияние на вычисление выражений 147
порядок вычисления подвыражений 120
ассоциативные контейнеры
неприменимость обобщенных алгоритмов переупорядочения 458
ассоциирование
значений, использование класса pair 109
б
базовые классы
абстрактные базовые классы 689
видимость классов
при виртуальном наследовании 749
видимость членов
при множественном наследовании 739
при одиночном наследовании 737
виртуальные базовые классы 750
деструкторы 682
доступ
к базовым классам 734
к закрытым базовым классам 733
к защищенным членам 661
к членам 674
доступ к элементам отображения с помощью 239
конструирование
виртуальное наследование 748
множественное наследование 722
одиночное наследование 680
почленная инициализация 703
определение базового класса
при виртуальном наследовании 744
при множественном наследовании 725
при одиночном наследовании 666
преобразование к базовому классу 660
при выведении аргументов шаблона функции 382
присваивание, почленное присваивание 705
байты
запись с помощью put() 809
чтение с помощью get() 812
безопасное связывание 306
перегруженных функций 349
бесконечный
рекурсия 279
цикл, избежание в операциях поиска в строке 221
бинарные
операторы 119
битовое поле
как средство экономии памяти 497
битовый вектор 137
в сравнении с классом bitset 137
блок
try-блок 419
инструкций 157
комментария 23
функциональный try-блок
и конструкторы 781
больше (>), оператор
поддержка в арифметических типах данных 28
булевский(е)
стандартные преобразования при разрешении перегрузки функции 358
в
вектор(ы)
find(), обобщенный алгоритм 433
емкость, связь с размером 209
увеличение размера 208
взятия адреса (&) оператор
использование в определении ссылки 93
использование с именем функции 293
взятия индекса оператор ([])
использование в классе bitset 141
использование в отображениях 236
видимость
определения символической константы 308
переменных в условии цикла 173, 304
роль в выборе функции-кандидата при разрешении перегрузки функции 363
требование к встроенным функциям 281, 309
висячий
проблемы висячего else, описание и устранение 163
время жизни 304
auto_ptr, влияние на динамически выделенные объекты 316
динамически выделенных объектов 313
сравнение с указателями на них 315
и область видимости (глава) 340
локальных объектов
автоматических и статических 310
влияние раскрутки стека на объекты типа класса 422
проблема возврата ссылки на локальный объект 277
вставка элементов
в вектор 105
в контейнер, с помощью адапторов функций 449
в контейнеры multimap и multiset 249
в отображение 236
в стек 251
итераторы, обозначение диапазона 449
различные механизмы для разных типов контейнеров 203
встроенные функции 113
объекты-функции 436, 441
объявление 281
шаблонов функций как 377
определение, размещение в заголовочном файле 307
перегруженные операторы вызова 437
преимущества 280
встроенный(е)
массивы
запрет присваивания другому массиву 259
запрет ссылаться на 100
отсутствие поддержки операции erase() 435
типы данных
арифметические 31
выполнение
непоследовательные инструкции 20
условное 19
выражения
(глава) 156
использование аргументов по умолчанию 272
разрешение имен 301
вычисление
порядок вычисления подвыражений 120
вычитание
minus, объект-функция 444
г
глобальное пространство имен
проблема засорения 59, 324
глобальные функции 304
д
данные-члены
изменчивые (mutable) 478
члены базового и производного классов 669
декремента оператор (--)
постфиксная форма 128, 568
префиксная форма 129, 567
деление
комплексных чисел 130
целочисленное 120
деструктор(ы) 528
для элементов массива 530
динамическое выделение памяти
для массива 135
как требование к динамически растущему вектору 205
динамическое освобождение памяти
для массивов 321
объектов 324
одиночных объектов 316
оператор delete 114, 313, 314, 576
утечка памяти 315
директивы 23
директивы связывания 283
в связи с перегрузкой 347
использование с указателями на функции 298
для элементов массива
динамическое выделение памяти 533
доступ
к контейнеру
последовательный доступ как критерий выбора типа 204
к массиву 28
индекс 41
индексирование 98
к пространству имен
механизмы, компромиссные решения 61
к членам 467, 473
оператор доступа к членам -> 566
уровни, protected 45
друзья 560
и специальные права доступа 115, 467
е
емкость контейнерных типов
в сравнении с размером 205
з
заголовочные файлы
как средство повторного использования объявлений функций 258
по имени
algorithm 65
iomanip 115
limits 122
memory 316
set 243
sstream 794
stack 250
string 61
vector 63, 104
содержимое
включение определения шаблона функции, преимущества и недостатки 388
директивы связывания 282
объявления 75, 309
объявления явных специализаций шаблонов 394
запись активации 262
автоматическое включение объектов в 310
И
И, оператор 120
и
идентификатор 75
использования в качестве спецификатора типа класса 110
соглашения по именованию 76
иерархии
определение
идентификация членов 669
исключений, в стандартной библиотеке C++ 783
поддержка мезанизма классов 110
именование
соглашения об именовании идентификаторов 76
имя 76
квалифицированные имена
статических членов класса 483
членов вложенных пространств имен 330
шаблонов функций как членов пространства имен 410
параметра шаблона
функции 376
перегруженные операторы 556
переменной 76
разрешение
в области видимости класса 502
инициализация
векторов 104
массива
динамически выделенного 320
динамически выделенных объектов классов 572
многомерного 101
указателей на функции 295
объектов
автоматических 310
автоматических, по сравнению с локальными статическими 312
глобальных, инициализация по умолчанию 305
динамически выделенных 313
статических локальных 311
поведение auto_ptr 317
сравнение с присваиванием 125
ссылок 93
указателя на функцию 293
влияние на спецификацию исключений 428
вопросы, связанные с перегруженными функциями 348
инкремента оператор (++)
встроенный 129
инструкции
break
для выхода из инструкции switch 168
continue 178
do-while 177
for 175
goto 180
if 19, 166
объявления 161
простые 158
инструкция
while 20
использование преобразования квалификаторов 355
использование шаблонов 55
итератор с произвольным доступом 454
итератор(ы) 106
end(), доступ к элементам контейнера 212
iterator, заголовочный файл 450
абстракция, использование а обобщенных алгоритмах для обхода 431
адаптор 434
доступ к подмножеству контейнера с помощью 212
категории 454
двунаправленный итератор 454
итератор записи 453
итератор чтения 453
однонаправленный итератор 454
требования к поведению, выдвигаемые обобщенными алгоритмами 455
к
китайский язык
поддержка двухбайтовых символьных литералов 70
класс(ы)
возвращаемые значения 277
вопросы эффективности 548
друзья 559
заголовок 463
объединение 496
параметры
вопросы эффективности 264
для возврата сразу нескольких значений 278
тело 463
командная строка
класс 291
опции
пример программы 289
комментарии 24
блочные 24
комплексные числа 18, 108
выражения с участием 130
заголовочный файл complex 107
как абстракция класса 28
операции 132
представление 131
типы данных 28
композиция
объектов 735
сравнение с наследованием 732
конкретизация
шаблона функции 378
К
Конкретизация
шаблона функции
разрешение перегрузки 402
к
константы
константные выражения
sizeof() как пример 135
размер массива должен быть 99
литерал 71
подстановка 308
ссылки, рассматриваемые как 93
конструктор(ы)
вызовы виртуальных функций в 700
для базовых классов
почленная инициализация 705
при единичном наследовании 680
для элементов массива
список инициализации массива 530
как коверторы 582
конструкторы по умолчанию 521
копирующие конструкторы 193, 524
почленная инициализация 543
ограничение возможности созданий объектов 521
список инициализации членов 539
контейнерные типы
емкость
связь с размером 210
и итераторы 214
инициализация, с помощью пары итераторов 213
параметры 271, 278
преимущества, автоматическое управление памятью 321
копирование
как операция инициализации 209
массивов 100
строк 87
копирующий
конструктор 39, 112
для динамического увеличения размера вектора 206
л
лексикографическое упорядочение
в обобщенных алгоритмах перестановок 457
в обобщенныых алгоритмах сравнения 457
литеральные константы 71
C-строки
сравнение с символьными литералами 100
f суффикс 70
U суффикс 70
с плавающей точкой 70
логические встроенные операторы 125
логические объекты-функции
logical_and 445
logical_not 445
logical_or 445
локализация
влияние глобального объекта на 278
константной переменной или объекта 90
на уровне файла, использование безымянного пространства имен 333
локальная область видимости 300, 304
try-блок 418
доступ к членам в глобальной области видимости, скрытым за локальными объектами 328
имена в пространстве имен, скрытые за локальными объектами 330
переменная, неинициализированная 310
разрешение имени 302
локальные объекты 312
проблема возврата ссылки на 276
статические 309
м
массив(ы)
в сравнении с векторами 105
динамическое выделение и освобождение
массивов объектов классов 533, 576
индексирование 29, 101
отсутствие контроля выхода за границы диапазона 101
инициализация 29, 100
динамически выделенных массивов объектов класса 533
использование оператора sizeof() 133
как параметры функций 270
для передачи нескольких параметров 278
многомерные 269
преобразование массива в указатель 354
многомерные 102
обход
с помощью манипуляции указателем 102
с помощью пары итераторов 213
объектов класса 535
определение 28, 98
перегруженный оператор
new[] 574
поддержка обобщенными алгоритмами 432
размер, не является частью типа параметра 267
связь с типом указателей 104
указателей на функции 295
меньше, оператор
поддержка в арифметических типах данных 28
требование о поддержке типом элементов контейнера 210
многоточие (...)
использование в типах функций 292
множество (set), контейнерный тип
size() 245
ограничение на изменение порядка 458
определени 244
сравнение с отображением 234
модели компиляции
шаблонов класса
с разделением 634
шаблонов функций 391
с включением 388
с разделением 389
н
наилучшая из устоявших функций 350
неоднозначность
перегруженных
функций, диагносцирование во время разрешения перегрузки 359
указателя, стандартные преобразования 360
шаблона функции
конкретизация, опасность перегрузки 396
неявные преобразования типов 148
о
область видимости
видимость класса
и определение класса 463
объявлений исключений в catch-обработчиках 421
параметра шаблона
функции 377
управляющих переменных в инструкции for 303
область видимости глобального пространства имен 300, 324
обобщенные алгоритмы
алфавитный указатель (приложение) 907
генерирования 457
использование итераторов 454
категории и описания 458
независимость от типа 431, 432
нотация для диапазона элементов 454
обзор 433
пример использования 441
работа с хипом 458
удаления 456
обратная косая черта (
как префикс escape-последовательности 70
обратные итераторы 449
обход
заполнение множества с помощью 243
использование с контейнерами multimap и multiset 248
множества 245
невозможность обхода перечислений 98
обход отображения 242
отображения текста на вектор позиций 240
параллельный обход двух векторов 237
объект(ы)
автоматические 310
использование памяти 74
определение 78
переменные как 74
члены пространства имен 326
объектно-ориентированное программирование
проектирование
(пример) 50
объектное программирование 462
объекты-функции 448
functional, заголовочный файл 443
использование в обобщенных алгоритмах 431
источники 443
логические 445
предопределенные 444
объявление
инструкция 14
объявления
в части инициализации цикла for 173
видимость имени, вводимого объявлением 300
и определение 305
исключения 420
класса bitset
объектов 142
локальность 159
перегруженное
оператора 112
функции 341
пространства имен 325
сопоставление объявлений в разных файлах 306
указателя на функцию 292
включение спецификации исключений в 428
функции 257
задание аргументов по умолчанию 271
размещение в заголовочном файле 307
функции-члена, перегруженное 593
шаблона функции
определение используемых имен 404
связь с определением 403
требования к размещению явных объявлений конкретизации 390
явной конкретизации
шаблона класса 635
оператор \ 123
оператор ввода 25
оператор вывода 795
перегрузка 815
оператор вызова функции 564
операторы
встроенные
sizeof 135
арифметические 122
перегруженные
delete 572
взятия индекса ([]) 562
вопросы проектирования 558
члены и не-члены класса 555
определения 15
typedef 108
исключений, как иерархий классов 773
класса
сравнение с определением класса 468
класса-диспетчера запросов (пример) 712
массива 99
многомерных массивов 101
множеств 245
объекта 305
объектов класса complex 107
последовательных контейнеров 211
производного класса 668
пространств имен 334
членов 332
отображения 248
map, заголовочный файл 234
заполнение 235
невозможность переупорядочения 458
текста
определение 238
отрицатели
как адапторы функций 446
очереди 253
queue, заголовочный файл 252
size() 252
top(), функция 253
очереди с приоритетами 252, 253
очередь с приоритетами 252
size() 252
ошибки
assert(), макрос 184
бесконечная рекурсия 279
в инструкции if 162
в циклах 164
зацикливание 84
висячие указатели 310
как избежать 315
динамического выделения памяти 315
итератор, использование 184
компиляции, конфликты в области видимости using-объявления 346
массив
индекс за концом 84
области видимости, подводные камни using-директивы 339
пропуска
завершающего нуля в C-строке 320
скобок при освобождении динамически выделенного массива 321
смещения на единицу при доступе к массиву 29
фазы связывания при наличии объявления в нескольких файлах 305
О
Ошибки
конкретизации шаблона функции 380
п
память
утечка 33
параметр(ы)
размер, важность для передачи по значению 262
параметры функций
использования многоточия 274
при разрешении перегруженных функций 342
проверка типов 261
списки параметров 260
сравнение параметров указательного и ссылочного типов 267
сравнение с глобальными объектами 279
ссылки 95, 265
использование для возврата нескольких значений 164
на константы 264
преимущества в эффективности 264
указатели 263
указатели на функции 298
переменные
константные 90
перестановки, обобщенные алгоритмы 459
перечисления 98
основания для включения в язык 96
расширение типа при разрешении перегрузки функции 357
по умолчанию
аргументы 273
влияние на выбор устоявших функций 371
побитовый(е)
оператор И (&) 137
оператор И с присваиванием (&=) 128, 137
оператор ИЛИ (!) 138
оператор ИСКЛЮЧАЮЩЕЕ ИЛИ (^) 138
оператор НЕ (~) 137
оператор сдвига (<<,>>) 138
операторы 139
поддержка в классе bitset 143
повторное возбуждение
исключения 424
позиция
разрешение аргумента по позиции в списке 271
поиск
rfind() 224
подстрок 225
элементов
множества 244
отображения текста 239
П
ПОО (правило одного определения) 304
п
последовательные контейнеры
вставка элементов 214
обобщенные алгоритмы 217
определение 208
перестановка элементов 216
присваивание 216
предостережения
использование знакового бита в битовых векторах 139
неопределенность порядка вычисления бинарных операторов сравнения 124
опасности приведения типов 150
подводные камни
возврата ссылки на объект 277
глобальные объекты 278
представление
строк 82
преобразование
бинарного объекта-функции в унарный, использование адаптора-связывателя 446
выбор преобразования между типами классов 592
выведение аргументов шаблона функции 381
как точное соответствие при разрешении перегрузки функции 362
квалификаторов
влияние на последовательность преобразований 369
при выведении аргументов шаблона функции 382
конверторы 352
множественные, разрешение неоднозначности приведения 367
определенное пользователем 352
последовательности
определенных пользователем преобразований 586
определенных пользователем, с учетом наследования 788
стандартных преобразований 371
с потерей точности, предупреждение компилятора 261
стандартное 360
трансформация I-значения
ранжирование при разрешении перегрузки функции 368
указателей
в тип void* и обратно 150
явные преобразования типов 122, 148, 150
препроцессор
комментарий
парный(/**/) 23
константы
__cplusplus__ 22
макросы
шаблоны функций как более безопасная альтернатива 373
предкомпилированные заголовочные файлы 307
приведение(я) 122
const_cast, оператор, опасность применения, 151
dynamic_cast (), оператор 767
dynamic_cast()
идентификация класса объекта во время выполнения 153
reinterpret_cast
опасности 152
reinterpret_cast, оператор 152
static_cast
сравнение с неявными преобразованиями 151
static_cast, оператор 152
выбор конкретизируемого шаблона функции 380
для принудительного установления точного соответствия 356
опасности 152
сравнение нового синтаксиса со старым 152
старый синтаксис 154
применение для подавления оптимизации 109
примеры
класс IntArray 42
IntSortedArray, производный класс 49
класс iStack
поддержка динамического выделения памяти 254
преобразование в шаблон stack 255
класс String 118
обработка аргументов в командной строке 284
функция sort 291
шаблон класса Array
SortedArray, производный класс 760
присваивание
векторам, сравнение с встроенными массивами 105
и поведение auto_ptr 317
комплексных чисел 130
оператор
и требования к l-значению 74
перегруженный 545, 562
составной 127
последовательному контейнеру 216
ссылке 95
указателю на функцию
вопросы, связанные с перегруженностью функции 348
проверка
типа
назначение и опасности приведения типов 152
неявные преобразования 261
объявления, разнесенного по нескольким файлам 306
отмена с помощью многоточия в списке параметров 273
параметра 261
указателя 80
программа 20
производительность
auto_ptr 317
классы, локальность ссылок 160
компиляции
при конкретизации шаблонов функций 390
контейнеров
компромиссы при выборе контейнера 204
сравнение списка и вектора 206
определения шаблона функции в заголовочном файле 388
сравнение обработки исключений и вызовов функций 429
ссылок
параметры и типы возвращаемых значений 310
указателей на функции
проигрыш по сравнению с параметрами-ссылками 421
проигрыш по сравнению со встроенными функциями 436
сравнение с объектами-функциями 442
функций
передачи аргументов по значению 262
производные классы
конструкторы 678
присваивание почленное 703
пространства имен
безымянные
отличие от других пространств имен 333
вложенные
и using-объявления 346
глобальное
проблема загрязнения пространства имен 324
область видимости 300
определения 327
определенные пользователем 325
члены
определения 331
требование правила одного определения 332
шаблоны функций 410
процедурное программирование
(часть 3) 461
псевдоним(ы)
имен типов, typedef 109
пространства имен 59, 335
р
разрешение перегрузки функции 351
(глава) 372
выбор преобразования 585
устоявшие функции 367
для вызовов операторных функций 601
для вызовов функций-членов 596
функции-кандидаты
для вызовов функций-членов 594
явные приведения как указания компилятору 356
Р
Разрешения области видимости оператор (
):доступ к шаблону функции как члену пространства имен 410
р
разыменования оператор (*)
использование с возвращенным типом указателя 292
не требуется для вызова функции 293
опасности, связанные с указателями 266
ранжирование
определений шаблона функции 396
рассказ об Алисе Эмме 202
и реализация класса string 116
С
С, язык
функции
указатели на функции 298
с
символ(ы)
литералы
синтаксис записи 70
массив символов, инициализация 100
нулевой, для завершения строкового литерала 71
символы
(обратная косая черта знак вопроса)
escape-последовательность \ 70
__STDC__ 22
_обратная косая черта одиночная кавычка)
escape-последовательность \ 70
- (минус)
использование для обозначения опций в командной строке 284
-- (двойной минус)
оператор декремента 128
-= (минус равно)
оператор вычитания с присваиванием 128
-> (минус правая угловая скобка)
оператор \ 566
, (запятая)
неправильное применение для индексации массива 102
оператор 136
; (точка с запятой)
для завершения инструкций 157
: (двойное двоеточие):оператор разрешения области видимости 329
: (двойное двоеточие):оператор разрешения области видимости класса 39
! (восклицательный знак)
оператор \ 123, 124
?\
(знак вопроса двоеточие):условный оператор 113, 132
(знак вопроса двоеточие):условный оператор:сокращенная запись if-else 165
. (точка)
оператор \ 35
... (многоточие) 274
для обозначения универсального catch-обработчика 424
() (круглые скобки)
использование оператора вызова для передачи объекта-функции 442
(обратная косая черта a)
escape-последовательность \ 70
(обратная косая черта n)
escape-последовательность \ 70
(обратная косая черта v)
escape-последовательность \ 70
(обратная косая черта)
как escape-символ 225
[,) (левая квадрнатная, правая круглая скобки)
для обозначения интервала с включенной левой границей 454
[] (квадратные скобки)
для освобождения выделенной под массив памяти 321
оператор взятия индекса 563
оператор взятия индекса:для доступа к вектору 104
оператор взятия индекса:для проверки битов в битовом векторе 141
оператор взятия индекса:не поддерживается для контейнеров multiset и multimap 250
оператор индексирования массива, перегрузка в определении класса массива 41
{} (фигурные скобки)
использование в объявлениях пространств имен 326
использование в предложении catch 418
использование в составной директиве связывания 282
как ограничители составной инструкции 157
при инициализации вложенного массива 101
* (звездочка)
оператор разыменования:доступ к объектам с помощью 80
оператор разыменования:использование для задания типа возвращаемого значения 292
оператор разыменования:как унарный оператор 119
оператор разыменования:определение указателей с помощью 79
оператор разыменования:приоритет 103
оператор умножения:характеристики и синтаксис 120
*= (звездочка равно)
оператор умножения с присваиванием 128
/ (косая черта)
оператор деления:характеристики и синтаксис 120
/= (косая черта равно)
оператор деления с присваиванием 128
\\ (двойная обратная косая черта)
escape-последовательность \ 70
\\ \ 70
\\t (обратная косая черта t)
escape-последовательность горизонтальнаятабуляция 70
& (амперсанд)
оператор взятия адреса:использование с именем функции 137
оператор взятия адреса:как унарный оператор 119
&& (двойной амперсанд)
оператор логического И 120
&= (амперсанд равно)
оператор побитового И с присваиванием:как оператор составного присваивания 127
% (процент)
оператор вычисления остатка, характеристики и синтаксис 121
%= (процент равно)
оператор вычисления остатка с присваиванием 128
^ (крышка)
оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ 137
^= (крышка равно)
оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ с присваиванием 137
+ (плюс)
оператор сложения:поддержка в арифметических типах данных 28
++ (двойной плюс)
оператор инкремента 128, 569
+= (плюс равно)
оператор сложения с присваиванием 123
< (левая угловая скобка)
оператор \ 210, 436, 441
<< (двойная левая угловая скобка)
оператор вывода 25
оператор сдвига влево 137
<<=(двойная левая угловая скобка равно)
оператор левого сдвига с присваиванием 128
<> (угловые скобки)
явный шаблон:применение в специализациях 391
явный шаблон:спецификации аргументов 384
= (равно)
оператор присваивания 90
оператор присваивания:и l-значение 74
оператор присваивания:использование с объектами классов 36
оператор присваивания:использование с псевдонимами пространств имен 334
== (двойное равно)
оператор равенства:поддержка в арифметических типах данных 28
>> (двойная правая угловая скобка)
оператор ввода 809
оператор ввода:перегрузка 820
оператор сдвига вправо 137
>>=(двойная правая угловая скобка равно)
оператор правого сдвига с присваиванием 128
| (вертикальная черта)
оператор побитового ИЛИ 137
|= (вертикальная черта равно)
оператор побитового ИЛИ с присваиванием 137
оператор побитового ИЛИ с присваиванием:как оператор составного присваивания 128
|| (двойная вертикальная черта)
оператор логического ИЛИ:характеристики и синтаксис 123
оператор логического ИЛИ:вычисление 123
сложения (+) оператор
комплексных чисел 130
сокрытие информации 36, 466
вопросы, связанные с вложенными пространствами имен 330
доступ к
закрытым членам класса 472
имена в локальной области видимости 302
объявление члена пространства имен, обход с помощью оператора разрешения области видимости 328
параметры шаблона, имена в глобальной области видимости 376
сравнение с перегрузкой 345
во вложенных областях видимости 364
члены глобальной области видимости, доступ с помощью оператора разрешения области видимости 328
составные
выражения 120
присваивания
операторы над комплексными числами 130
состояния условий
в применении к библиотеке iostream 829
списки
merge(), обобщенный алгоритм
специализированная реализация для списка 459
size() 180
как последовательный контейнер 211
обобщенные 199
поддержка операций merge() и sort() 217
сравнение с векторами 204
требования к вставке и доступу 204
сравнения
объекты-функции 445
операторы
поддержка в контейнерах 210
ссылки
для объявления исключения в catch-обработчике 424
инициализация
ссылки на const 95
как тип возвращаемого значения функции 276
сравнение с указателями 93
статические объекты
объявление, сравнение с безымянным пространством имен 333
статические члены класса
указатели на 492
статическое выделение памяти 31
стек, контейнерный тип 252
stack, заголовочный файл 250
top(), функция 129, 250
операции (таблица) 250
стека, пример класса 156
строки
append() 231
assign() 231
compare() 232
erase() 215, 230
insert() 215
replace() 233
swap() 216, 231
поиск подстроки 225, 230, 232
т
тело
функции 257
тип
точное соответствие 356
тип(ы)
bool 96
C-строка 85
typedef, синоним типа 108
арифметические 31
для определения нескольких объектов одного и того же типа pair 109
имя класса как 464
использование с директивой препроцессора include 61
точка конкретизации
шаблона функции 406
у
угловые скобки (<>)
шаблон
использование для определения 50
явные
специализации шаблона 391
спецификации аргументов шаблона 384
указатели 81
sizeof(), использование с 134
void* 80
адресация
C-строк 83
объектов 80
объектов класса, использование оператора -> 470
вектор указателей, преимущества 207
висячий
возвращенное значение, указывающее на автоматический объект 310
указывающий на освобожденную память 315
использование в обобщенных алгоритмах 104
как значение, возвращаемое функцией 295
как итераторы для встроенного массива 213
нулевой указатель 360
как операнд оператора delete 315
параметры 263, 266
сравнение со ссылками 40, 94
указатели на функции 299
вызов по 294
и спецификации исключений 429
инициализация 293
на перегруженные функции 348
написанные на других языках 298
присваивание 293
сравнение с указателями на данные (сноска) 79
указатели на члены 493
указатели на данные-члены 490
указатели на функции-члены 489
умножения оператор (*)
поддержка в арифметических типах данных 28
унарные операторы 119
условный
директивы препроцессора 20
инструкция
switch 172
оператор (?
):сравнение с функциями 280
условный оператор
инструкция 157
ф
файл(ы)
ввод/вывод 27
входной
открытие 26
выходной
открытие 27
несколько
размещение определения пространства имен в 327
сопоставление объявлений в 306
функции
возвращаемые значения
локальный объект, проблема возвращения ссылки на 277
объект класса как средство вернуть несколько значений 279
параметр-ссылка как средство возврата дополнительного значения 263
указатель на функцию 297
вызовы
заключенные в try-блок 418
недостатки 280
сравнение с обработкой исключений 423
и локальная область видимости 302
имя функции
преобразуется в указатель 292
интерфейс
объявление функции как 258
прототип функции как описание 258
локальное хранение 262
на другом языке, директивы связывания 281
обращение к 257
объявления
как члена пространства имен 325
объявления перегруженных функций 343
и область видимости 347
когда не надо перегружать 345
причины для перегрузки функций 341
определение 256
как часть шаблона функции 375
сравнение с объявлениями 304
преобразование функции в указатель 355
рекурсивные 280
сигнатура 260
тип
недопустимость возврата из функции 259
преобразование в указатель на функцию 276
тип возвращаемого значения 259
недопустимость указания для конструкторов 516
недостаточен для разрешения перегруженных функций 342
функции-кандидаты 350, 366
вызов с аргументами типа класса 587
для вызовов в области видимости класса 589
для перегруженных операторов 600
для шаблонов функций, 398
наследование и 787
функции-члены 110, 466, 477
вызов 112
модификация для обработки исключений 415
независимые от типа 46
определение 113
открытые
доступ к закрытым членам с помощью 37
перегруженные
проблемы 345
функции-кандидаты 593
статические 486
х
хип 135, 313
выделение памяти для массива в 319
выделение памяти для объекта в 313
исключение bad_alloc 314
обобщенные алгоритмы 904
См. также обобщенные алгоритмы 905
ц
целые
расширение типа 149
стандартные преобразования 149
при разрешении перегрузки функции 358
типы данных 68
цикл(ы) 20
инструкции
while 176
завершение
break, инструкция 178
инструкции
for 174
while 20
ошибки программирования 164
условие останова 30
ч
числа с плавающей точкой
арифметика, характеристики и смежные темы 122
правила преобразования типов 149
стандартные преобразования при разрешении перегрузки функции 358
численные обобщенные алгоритмы 457
читабельность
typedef 108
в объявлениях указателей на функции 294
как синоним контейнерных типпов 236
имен параметров 260
имен перегруженных функций 343
квалификатор const для объявления констант 90
параметров-ссыслок 267
разделение обработчиков исключений 417
рекурсивных функций 279
члены класса
this
использование в перегруженном операторе присваивания 544
когда использовать в функциях-членах 482
указатель this 481
битовые поля 497
данные-члены 465
изменчивые (mutable) 478
статические 485
тип члена 491
функции-члены
встроенные и не-встроенные 472
закрытые и открытые 475
конверторы 581
специальные функции-члены 475
спецификации исключений для 780
статические 486
тип члена 490
шаблоны 630
ш
шаблоны классов
(глава) 649
вложенные типы 627
и пространства имен 644
модели компиляции 636
с включением 632
с разделением 635
объявления друзей в 623
определения 609
разрешение имен в 643
параметры 608
параметры-типы 613
статические члены классов 625
точка конкретизации, для функций-членов 643
частичные специализации 640
члены
функций 618
явные
специализации 639
шаблоны функций
(глава) 413
и пространства имен 410
конкретизации 380
определение 378
параметры
для повышения гибкости обобщенных алгоритмом 441
параметры-константы 375
параметры-типы 375
перегрузка 397
передача объектов-функций шаблону 443
разрешение имен в определениях 407
разрешение перегрузки при конкретизации 402
тип возвращаемого значения и выведение аргументов шаблона 385
явные
спецаиализации 395
э
эффективность
сравнение с гибкостью при выделении памяти 31
я
явное
преобразование 153
1 Во время написания этой книги не все компиляторы С++ поддерживали пространства имен. Если ваш компилятор таков, откажитесь от данной директивы. Большинство программ, приводимых нами, используют компиляторы, не поддерживающие пространство имен, поэтому директива using в них отсутствует.
2 Как было сказано ранее, не все компиляторы поддерживают пространства имен, поэтому эта разница проявляется только для последних версий компиляторов.
3 Объявление функции inline – это всего лишь подсказка компилятору. Однако компилятор не всегда может сделать функцию встроенной, существуют некоторые ограничения. Подробнее об этом сказано в разделе 7.6.
4 Вот как выглядит общее решение этой проблемы:
Example2( elemType nval = elemType() ) " _val( nval ) {}
5 На самом деле для указателей на функции это не совсем так: они отличаются от указателей на данные (см. раздел 7.9).
6 STL расшифровывается как Standard Template Library. До появления стандартной библиотеки С++ классы vector, string и другие, а также обобщенные алгоритмы входили в отдельную библиотеку с названием STL.
7 Проверку на неравенство 0 можно опустить. Полностью эквивалентна приведенной и более употребима следующая запись: ptr && *ptr.
8 До принятия стандарта языка С++ видимость объектов, определенных внутри круглых скобок for, простиралась на весь блок или функцию, содержащую данную инструкцию. Например, употребление двух циклов for внутри одного блока
{
//
верно
для стандарта С++
//
в
предыдущих версиях C++
- ошибка: ival определена
дважды
for
(int ival = 0; ival < size; ++iva1 ) // ...
for
(int ival = size-1; ival > 0; ival ) // ...
в ранних версиях языка вызывало ошибку: ival определена дважды. В стандарте С++ данный текст синтаксически правилен, так как каждый экземпляр ival является локальным для своего блока.
9 Замечание. Для упрощения программы мы требуем, чтобы каждое слово было отделено пробелом от скобок и логических операторов. Таким образом, запросы вида
(War
|| Rights)
не будут поняты нашей системой. Хотя удобство пользователей не должно приноситься в жертву простоте реализации, мы считаем, что в данном случае можно смириться с таким ограничением.
10 Иллюстрация Елены Дрискилл (Elena Driskill).
11 Отметим, что deque не поддерживает операцию reserve()
12 Существующие на сегодняшний день реализации не поддерживают шаблоны с параметрами по умолчанию. Второй параметр – allocator – инкапсулирует способы выделения и освобождения памяти. В С++ он имеет значение по умолчанию, и его задавать не обязательно. Стандартная реализация использует операторы new и delete. Применение распределителя памяти преследует две цели: упростить реализацию контейнеров путем отделения всех деталей, касающихся работы с памятью, и позволить программисту при желании реализовать собственную стратегию выделения памяти. Определения объектов для компилятора, не поддерживающего значения по умолчанию параметров шаблонов, выглядят следующим образом:
vector<
string, allocator > svec;
13 Если функция-член push_front() используется часто, следует применять тип deque, а не vector: в deque эта операция реализована наиболее эффективно.
14 Последняя форма insert() требует, чтобы компилятор работал с шаблонами функций-членов. Если ваш компилятор еще не поддерживает это свойство стандарта С++, то оба контейнера должны быть одного типа, например два списка или два вектора, содержащих элементы одного типа.
15 Программа компилировалась компилятором, не поддерживающим значений параметров по умолчанию шаблонов. Поэтому нам пришлось явно указать аллокатор:
vector<string,allocator> *lines_of_text;
Для компилятора, полностью соответствующего стандарту С++, достаточно отметить тип элементов:
vector<string> *lines_of_text;
16 Конечно, в английском языке существуют исключения из правил. Наш эвристический алгоритм превратит crises (множ. число от crisis – прим. перев.) в cris. Ошибочка!
17 Таким образом, как мы видим, определения встроенных функций могут встретиться в программе несколько раз! – Прим. ред.
18 Полный текст реализации класса CommandOpt можно найти на Web-сайте издательства Addison-Wesley.
1. Если имеющийся у Вас компилятор пока не поддерживает параметр шаблонов по умолчанию, то конструктору istream_iterator необходимо будет явно передать также и второй аргумент: тип difference_type, способный хранить результат вычитания двух итераторов контейнера, куда помещаются элементы. Например, в разделе 12.2 при изучении программы, которая должна транслироваться компилятором, не поддерживающим параметры шаблонов по умолчанию, мы писали:
typedef vector<string,allocator>::difference_type diff_type
istream_iterator< string, diff_type > input_set1( infile1 ), eos;
istream_iterator< string, diff_type > input_set2( infile2 );
Если бы компилятор полностью удовлетворял стандарту C++, достаточно было бы написать так:
istream_iterator< string > input_set1( infile1 ), eos;
istream_iterator< string > input_set2( infile2 );
1 Более подробное обсуждение этой темы с примерами и приблизительными оценками производительности см. в [LIPPMAN96a].
2 В реальной программе мы объявили бы член _name как имеющий тип string. Здесь он объявлен как C-строка, чтобы отложить рассмотрение вопроса об инициализации членов класса до раздела 14.4.
3 Для тех, кто раньше программировал на C: приведенное выше определение класса Account на C выглядело бы так:
typedef struct {
char *_name;
unsigned int _acct_nmbr;
double _balance;
} Account;
4 См. статью Джерри Шварца в [LIPPMAN96b], где приводится дискуссия по этому поводу и описывается решение, остающееся пока наиболее распространенным.
5 Сигнатура ассоциированного конструктора имеет следующий смысл. Копирующий конструктор применяет некоторое значение к каждому элементу по очереди. Задавая в качестве второго аргумента объект класса, мы делаем создание временного объекта излишним:
explicit vector( size_type n, const T& value=T(), const Allocator&=Allocator());
1 Напомним, что для упрощения реализации необходимо, чтобы между любыми двумя словами, включая скобки и операторы запроса, был пробел. В реальной системе такое требование вряд ли разумно, но мы полагаем, что для вводного курсе, каковым является наша книга, это вполне приемлемо.
3 Увы! Правые скобки не распознаются, пока OrQuery не выведет все ассоциированное с ним частичное решение.
19 Полный текст программы можно найти на FTP-сайте издательства Addison-Wesley по адресу, указанному на задней стороне обложки.
1 Здесь есть потенциальная опасность появления висячей ссылки, если пользователь сохранит адрес какого-либо элемента исходного массива перед тем, как grow() скопирует массив в новую область памяти. См. статью Тома Каргилла в [LIPPMAN96b].
1 Кроме того, программист может устанавливать и сбрасывать флаги состояния формата с помощью функций-членов setf() и unsetf(). Мы их рассматривать не будем; исчерпывающие ответы на вопросы, относящиеся к этой теме, можно получить в [STROUSTRUP97].