Введение
Глава 1. Использование параметризованных
функций
Почему следует использовать параметризованные
функции?
Обзор функций шаблонов
Построение параметризованных функций
сортировки
Пузырьковая сортировка - злой дух перестановок.
Сортировка методом отбора
Сортировка методом вставки
Усовершенствованные методы сортировки
Метод быстрой сортировки
Сравнение алгоритма быстрой сортировки со
стандартной функцией qsort ()
Сортировка типов, определенных пользователем
Поиск
Бинарный поиск
Рекомендации для самостоятельной разработки
Глава 2. Исследование параметризованных
классов
Обзор параметризованных классов
Ограниченные массивы
Очереди
Стеки
Связные списки
Бинарные деревья
Рекомендации для самостоятельной разработки
Глава 3. Объектно-ориентированная программа
разбора математических выражений
Выражения
Разбор выражений: постановка проблемы
Разбор выражения
Класс Parser
Разбиение выражений
Простая программа разбора выражений
Включение в программу разбора выражений
возможность работы с переменными
Синтаксическая проверка в рекурсивно-нисходящем
алгоритме
разбора выражений
Построение параметризованной версии программы
разбора выражений
Рекомендации для самостоятельной разработки
Глава 4. Разреженные массивы в стиле C++
Цели разработки разреженных массивов
Объекты типа разреженных массивов
Разреженный массив на базе связного списка
Разреженным массивы на основе бинарных деревьев
Разреженные массивы на основе массивов
указателей
Хэширование
Выбор подхода к реализации разреженных массивов
Рекомендации для самостоятельной разработки
Глава 5. Принципы работы с информацией типа
Run-time и ее использование
Зачем нужна информация RTTI?
Использование механизма typeid
Использование механизма dynamic_cast
Применение RTTI
Рекомендации для самостоятельной разработки
Глава 6. Строки: использование стандартного
класса строк
Почему стандартный класс string включен в
определение C++?
Конструкторы строк
Операторы класса string
Некоторые функции-члены класса string
Простой строкоориентированный редактор,
использующий класс string
Рекомендации для самостоятельной разработки
Глава 7. Шифрование и сжатие данных
Краткая история криптографии
Шифры замены
Алгоритмы перестановок
Шифры битовых манипуляций
Сжатие данных
Рекомендации для самостоятельной разработки
Глава 8. Интерфейс с функциями языка
ассемблера
Для чего нужно использование языка ассемблера?
Основные принципы интерфейса с языком
ассемблера
Соглашения о вызовах для компилятора C++
Несколько слов о моделях памяти
Разработка функции на ассемблере
Передача аргументов функции
Вызов библиотечных функций и операторов
Получение доступа к структурам и классам
Использование указателей и ссылок
Пример, использующий гигантскую (huge) модель
памяти
Ручная оптимизация
Построение основы для кода на ассемблере
Использование asm
Рекомендации для самостоятельной разработки
Глава 9. Создание и интеграция новых типов
данных
Теория множеств
Определение типа множества
Конструкторы и деструктор класса Set
Добавление и удаление членов множества
Определение членства
Конструктор Copy
Присваивание для множеств
Перегрузка оператора+
Перегрузка оператора -
Пересечение множеств
Симметричная разность
Определение равенства, неравенства и
подмножества
Определение членства
Преобразование в целое
Перегрузка операторов ввода/вывода
Демонстрационная программа работы с множествами
Рекомендации для самостоятельной разработки
Глава 10. Реализация языковых интерпретаторов
на C++
Модуль разбора выражений Small BASIC
Программа разбора выражений Small BASIC
Интерпретатор Small BASIC
Полный код интерпретатора
Использование Small BASIC
Глава 11. От C++ к Java
Что представляет собой Java?
Почему Java?
Магическое решение Java: Java Bytecode
Различия между Java и C++
Методы вместо функций
Работа с классами
Иерархия классов Java
Классы и файлы
Пакеты и импорт
Рекомендации для самостоятельной разработки
Приложение А. Список ключевых слов С++
Index