Сообщений 3    Оценка 231        Оценить  
Система Orphus

C++. Сборник рецептов.

Авторы: Д. Р. Стефенс
К. Диггинс
Д. Турканис
Д. Когсуэлл
Издательство: Кудиц-Образ, 2007
624 страницы
ISBN: 5-91136-030-6
ISBN: 0-596-00761-2

Материал предоставил: Алексей Кирюшкин
Найти в магазинах
Купить в Books.Ru
Купить в Болеро (273 руб.)

Аннотация

Содержание
Предисловие
О примерах
Использование примеров кода
Комментарии и вопросы
Об авторах
Комментарии

Аннотация

Данная книга написана экспертами по С++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost.Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

Содержание

Предисловие

1. Сборка приложений на С++

1.1. Получение и установка GCC
1.2. Сборка простого приложения <Hello, World> из командной строки
1.3. Сборка статической библиотеки из командной строки
1.4. Сборка динамической библиотеки из командной строки
1.5. Сборка сложного приложения из командной строки
1.6. Установка Boost.Build
1.7. Сборка простого приложения <Hello, World> с помощью Boost.Build
1.8. Сборка статической библиотеки с помощью Boost.Build
1.9. Сборка динамической библиотеки с помощью Boost.Build
1.10. Сборка сложного приложения с помощью Boost.Build
1.11. Сборка статической библиотеки с помощью IDE
1.12. Сборка динамической библиотеки с помощью IDE
1.13. Сборка сложного приложения с помощью IDE
1.14. Получение GNU make
1.15. Сборка простого приложения <Hello, World> с помощью GNU make
1.16 Сборка статической библиотеки с помощью GNU Make
1.17. Сборка динамической библиотеки с помощью GNU Make
1.18. Сборка сложного приложения с помощью GNU make
1.19. Определение макроса
1.20. Указание опций командной строки из IDE05
1.21. Создание отладочной сборки
1.22. Создание окончательной сборки
1.23. Указание варианта библиотеки времени выполнения
1.24. Включение строгого соответствия стандарту С++
1.25. Указание определенной библиотеки для автоматической компоновки с исходным файлом
1.26. Использование экспортируемых шаблонов

2. Организация кода

2.1. Обеспечение единственности подключения заголовочного файла
2.2. Обеспечение единственности экземпляра переменной при большом количестве исходных файлов
2.3. Снижение числа #include с помощью предварительного объявления классов
2.4. Предотвращение конфликта имен с помощью пространств имен
2.5. Включение встраиваемого файла

3. Числа

3.1. Преобразование строки в числовой тип
3.2. Преобразование чисел в строки
3.3. Проверка, содержит ли строка допустимое число
3.4. Сравнение чисел с плавающей точкой с ограниченной точностью
3.5. Лексический анализ строки, содержащей число в экспоненциальной форме
3.6. Преобразования между числовыми типами
3.7. Получение минимального и максимального значений числового типа

4. Строки и текст

4.1. Дополнение строк
4.2. Обрезка строк
4.3. Хранение строк в последовательности
4.4. Получение длины строки
4.5. Обращение строк
4.6. Разделение строки
4.7. Разбиение строки на лексемы
4.8. Объединение нескольких строк
4.9. Поиск в строках
4.10. Поиск n-го вхождения подстроки
4.11. Удаление подстроки из строки
4.12. Преобразование строки к нижнему или верхнему регистру
4.13. Выполнение сравнения строк без учета регистра
4.14. Выполнение поиска строк без учета регистра
4.15. Преобразование между табуляциями и пробелами в текстовых файлах
4.16. Перенос строк в текстовом файле
4.17. Подсчет числа символов, слов и строк в текстовом файле
4.18. Подсчет вхождений каждого слова в текстовом файле
4.19. Добавление полей в текстовый файл
4.20. Выравнивание текста в текстовом файле
4.21. Замена в текстовом файле последовательностей пробелов на один пробел
4.22. Автозамена текста при изменении буфера
4.23. Чтение текстового файла с разделителями-запятыми
4.24. Использование регулярных выражений для разделения строки.

5. Даты и время

5.1. Получение текущей даты и времени
5.2. Форматирование даты/времени в виде строки
5.3. Выполнение вычислений с датами и временем
5.4. Преобразование между часовыми поясами
5.5. Определение номера дня в году
5.6. Определение ограниченных типов значений

6. Управление данными с помощью контейнеров

6.1. Использование vector вместо массивов
6.2. Эффективное использование vector
6.3. Копирование вектора
6.4. Хранение указателей в векторе
6.5. Хранение объектов в списке
6.6. Отображение строк на другие объекты
6.7. Использование хеш-контейнеров
6.8. Хранение объектов в упорядоченном виде
6.9. Хранение контейнеров в контейнерах

7. Алгоритмы

7.1. Перебор элементов контейнера
7.2. Удаление объектов из контейнера
7.3. Случайное перемешивание данных
7.4. Сравнение диапазонов
7.5. Объединение данных
7.6. Сортировка диапазона
7.7. Разделение диапазона
7.8. Выполнение для последовательностей операций над множествами
7.9. Преобразование элементов последовательности
7.10. Написание собственного алгоритма
7.11. Печать диапазона в поток

8. Классы

8.1. Инициализация переменных-членов класса
8.2. Использование функции для создания объектов (шаблон фабрики)
8.3. Использование конструкторов и деструкторов для управления ресурсами (RAII)
8.4. Автоматическое добавление новых экземпляров класса в контейнер
8.5. Гарантия единственности копии переменной-члена
8.6. Определение типа объекта во время выполнения
8.7. Определение, является ли класс объекта подклассом другого класса
8.8. Присвоение каждому экземпляру класса уникального идентификатора
8.9. Создание Singleton-класса
8.10. Создание интерфейса с помощью абстрактного базового класса
8.11. Написание шаблона класса
8.12. Написание шаблона метода класса
8.13. Перегрузка операторов инкремента и декремента
8.14. Перегрузка арифметических операторов и операторов присвоения для работы с классами
8.15. Вызов виртуальной функции родительского класса

9. Исключения и безопасность

9.1. Создание класса исключения
9.2. Создание безопасного при исключениях конструктора
9.3. Создание безопасного при исключениях списка инициализации
9.4. Создание безопасных при исключениях функций-членов
9.5. Безопасное копирование объекта

10. Потоки и файлы

10.1. Вывод выровненного текста
10.2. Форматирование вывода чисел с плавающей точкой
10.3. Написание своих собственных манипуляторов потока
10.4. Создание класса, записываемого в поток
10.5. Создание класса, считываемого из потока
10.6. Получение информации о файле
10.7. Копирование файла
10.8. Удаление или переименование файла
10.9. Создание временного имени файла и временного файла
10.10. Создание каталога
10.11. Удаление каталога
10.12. Чтение содержимого каталога
10.13. Извлечение расширения файла из строки
10.14. Извлечение имени файла из полного пути
10.15. Извлечение пути из полного имени файла
10.16. Замена расширения файла
10.17. Объединение двух путей в один

11. Наука и математика

11.1. Подсчет количества элементов в контейнере
11.2. Поиск наибольшего или наименьшего значения в контейнере
11.3. Вычисление суммы и среднего значения элементов контейнера
11.4. Фильтрация значений, выпадающих из заданного диапазона
11.5. Вычисление дисперсии, стандартного отклонения и других статистических функций
11.6. Генерация случайных чисел
11.7. Инициализация контейнера случайными числами
11.8. Представление динамического числового вектора
11.9. Представление числового вектора фиксированного размера
11.10. Вычисление скалярного произведения
11.11. Вычисление нормы вектора
11.12. Вычисление расстояния между векторами
11.13. Реализация итератора с шагом
11.14. Реализация динамической матрицы
11.15. Реализация статической матрицы
11.16. Умножение матриц
11.17. Вычисление быстрого преобразования Фурье
11.18. Работа с полярными координатами
11.19. Выполнение операций с битовыми наборами
11.20. Представление больших чисел фиксированного размера
11.21. Реализация чисел с фиксированной точкой

12. Многопоточная обработка

12.1. Создание потока
12.2. Обеспечение потокозащищенности ресурсов
12.3. Уведомление одного потока другим
12.4. Однократная инициализация совместно используемых ресурсов
12.5. Передача аргумента функции потока

13. Интернационализация

13.1. Жесткое кодирование строк в коде Unicode
13.2. Запись и чтение чисел
13.3. Запись и чтение дат и времен
13.4. Запись и чтение денежных значений
13.5. Сортировка локализованных строк

14. XML

14.1. Синтаксический анализ простого документа XML
14.2. Работа со строками Xerces
14.3. Синтаксический анализ сложного документа XML
14.4. Манипулирование документом XML
14.5. Проверка документа XML на соответствие определению DTD
14.6. Проверка документа XML на соответствие схеме
14.7. Преобразование документа XML с помощью XSLT
14.8. Вычисление XPath-выражения
14.9. Применение XML для сохранения и восстановления набора объектов

15. Разные функции

15.1. Применение указателей функций для их обратного вызова
15.2. Применение указателей для членов класса
15.3. Обеспечение невозможности модификации аргумента в функции
15.4. Обеспечение невозможности модификации своих объектов в функции-члене
15.5. Написание оператора, не являющегося функцией-членом
15.6. Инициализация последовательности значениями, разделяемыми запятыми

Предметный указатель

Предисловие

C++ работает практически на любой платформе и используется в бесчисленном количестве приложений. Если вы купили или собираетесь купить эту книгу, вы, вероятно, являетесь программистом, инженером или исследователем, пишущим одно из таких приложений. Но независимо от того, что и для какой платформы вы пишете, велика вероятность, что вам придется снова решать многие из тех же проблем, которые уже решены другими программистами на C++ много лет назад. В этой книге мы будем решать многие из часто встречающихся проблем и объяснять каждое из решений.

Независимо от того, программируете ли вы на C++ уже много лет или используете его недавно, вы, скорее всего, знакомы с фрагментами, которые приходится переписывать для каждого нового проекта: арифметика и синтаксический анализ дат и времени, манипуляции со строками и текстом, работа с файлами, синтаксический анализ XML, использование стандартных контейнеров и т. п. Решения для всех таких проблем приведены в этой книге. Для некоторых случаев (например, арифметические операции с датами и временем) стандартная библиотека почти не содержит поддержки. Для других (например, работа со строками) стандартная библиотека содержит функционально богатые классы, но они не могут делать все, и решения некоторых очень часто встречающихся задач оказываются громоздкими.

Формат очень прост. Каждый рецепт содержит описание проблемы и код решения, а большинство содержит последующее обсуждение. Мы попытались быть прагматиками и решать проблемы, не слишком отклоняясь от цели, но во многих случаях имеются связанные проблемы, решение которых также очень полезно (или просто интересно), и мы приводим одну или две страницы пояснений.

Эта книга посвящена решению общих проблем с C++, но не является книгой для изучения C++. Мы предполагаем, что вы, по крайней мере, обладаете базовыми знаниями C++ и объектно-ориентированного программирования. В частности, будет полезно, если вы знакомы, по крайней мере, с:

Для чтения этой книги нет строгих предварительных требований, но наличие базовых знаний окажется весьма кстати.

О примерах

При создании наших примеров кода мы стремились к простоте, переносимости и производительности. Разработка каждого решения использовала сходный метод: если возможно, использовался стандартный C++ (язык или библиотека); если невозможно, то в качестве замены использовался стандарт де-факто. Например, многие из рецептов, относящихся к строкам, применяют стандартный класс string, а большинство математических и научных рецептов используют стандартные численные типы, контейнеры и шаблоны. Стандартная библиотека имеет мощную поддержку в этих областях, так что стандартных возможностей более чем достаточно. Однако C++ либо имеет слабую стандартную поддержку, либо не имеет ее вовсе в части многопоточности или синтаксического анализа XML. Таким образом, мы используем поддержку многопоточности, предоставляемую библиотекой Boost Threads, а для функциональности синтаксического анализа XML -парсер (parser) Xerces.

Часто в C++ имеется множество способов сделать одно и то же, что дает разработчикам определенную гибкость, но и приводит к спорам. Большая часть примеров иллюстрирует наилучшее общее решение, которое мы смогли найти, но это не означает, что не существует еще лучшего решения. Если есть альтернативные решения, которые оказываются лучшими в одних случаях, но не являются таковыми в других (возможно, решение, использующее стандартную библиотеку, некрасиво или неинтуитивно - в этом случае мы показываем альтернативное решение с использованием Boost), мы представляем альтернативные решения, чтобы показать вам различные имеющиеся решения.

Большое количество примеров используют шаблоны. Если у вас нет опыта в написании шаблонов, вам следует получить его как можно скорее. В этой книге очень мало вводного материала по шаблонам, за исключением двух рецептов в главе 8: 8.11 и 8.12. Большая часть интересных разработок на C++ относится к области метапрограммирования с использованием шаблонов и методического проектирования.

В момент написания этой книги в сообществе C++ происходят большие изменения. Первый технический отчет (называемый TR1) более или менее стабилен. Он стандартизирует набор функций, которые будут добавлены в следующую версию стандарта C++. Не существует требования поддержки его реализациями стандартной библиотеки, но многие поставщики уже начали реализовывать TR1, и можно ожидать, что скоро эти функции появятся в поставляемых компиляторах. Многие из библиотек из TR1 впервые появились в проекте Boost.

Мы активно используем библиотеки из Boost. Boost - это набор рецензируемых переносимых библиотек с открытым кодом, который заполняет многие пробелы в стандартной библиотеке. Текущая версия в момент написания книги 1.32, и скоро должна появиться версия 1.33. В примерах мы приводим много указаний на конкретные библиотеки Boost. Для получения дополнительной информации по Boost посетите Web-сайт проекта по адресу www.boost.org.

Использование примеров кода

Целью этой книги является помощь в вашей работе. Вы можете использовать код этой книги в ваших программах и документации. Вам не требуется обращаться к нам за разрешением, если вы не воспроизводите значительные фрагменты кода. Например, написание программы, которая использует несколько небольших кусков кода из этой книги, не требует разрешения. Продажа или распространение CD-ROM с примерами книг O'Reilly требует разрешения. Ответы на вопросы с помощью цитат из этой книги и цитирования кода не требуют разрешения. Встраивание значительного количества примеров кода из этой книги в вашу документацию к продукту требует разрешения.

Мы приветствуем, но не требуем полного указания источника. Обычно указание источника включает название, автора, издателя и ISBN. Например: '' C++ Cookbook ''by D. Ryan Stephens, Christopher Diggins, Jonathan Turkanis, and Jeff Cogswell. Copyright 2006 O'Reilly Media, Inc., 0-596-00761-2>.

Если вы полагаете, что использование вами примеров кода выходит за рамки личного пользования или подпадает под один из требующих разрешения вариантов, указанных выше, свяжитесь с нами по адресу permissions@oreilly.com.

Комментарии и вопросы

Пожалуйста, направляйте комментарии и вопросы по этой книге издателю:

O'Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

(800) 998-9938 (в США и Канаде)

(707) 829-0515 (международная или местная поддержка)

(707) 829-0104 (факс)

Для этой книги имеется Web-страница, на которой приводятся все исправления, примеры и дополнительная информация. Эта страница находится по адресу: http://www.oreilly.com/catalog/cplusplusckbk

Чтобы высказать комментарий или задать технический вопрос по этой книге, отправьте электронное письмо по адресу: bookquestions@oreilly.com

Для получения дополнительной информации о нашей книге, ссылок, содержимого Resource Centers и сети O'Reilly Network посетите наш Web-сайт: http://www.oreilly.com

Об авторах

Д. Райан Стефенс (D. Ryan Stephens) - студент, живущий в г. Темп, шт. Аризона; он занимается разработкой программного обеспечения и является автором ряда работ по программированию. Ему нравится программировать практически на любом языке, особенно на C++. В его интересы входит поиск информации и ее извлечение из данных, а также все, что связано с алгоритмами и большими наборами данных. Когда он не работает, не пишет статьи и не программирует, он играет со своими детьми, работает по дому и катается на велосипеде.

Кристофер Диггинс (Christopher Diggins), который начал заниматься программированием в очень раннем возрасте (haut comme trois pommes), является независимым разработчиком программного обеспечения и автором, пишущим в этой области. Кристофер регулярно публикует свои статьи в журнале C++ Users Journal и является разработчиком языка программирования Heron.

Джонатан Турканис (Jonathan Turkanis) - автор библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом, охватывающих такие области, как "умные" указатели, отражение состояния программы на этапе выполнения, программирование обобщенных компонент и программирование, ориентированное на характерные особенности (aspect-oriented programming). Он является аспирантом Калифорнийского университета г. Беркли по специальности "математическая логика".

Джефф Когсуэлл (Jeff Cogswell) занимается разработкой программного обеспечения и живет недалеко от Цинциннати, шт. Огайо. Он программирует на C++ почти со времени появления этого языка, и им написано много работ по нему, включая две другие книги по C++. Он также любит программировать на других языках, особенно на Python. Когда не работает (что случается редко), он любит читать хороший роман или играть на гитаре.

Комментарии

Алексей Кирюшкин

Наконец-то в книгах а-ля "Сборник рецептов" С++ присутствует не только в виде плюсов на обложке, а стандартная библиотека из разряда экзотики перешла в стандарты де-факто. В этой книге нет ни одного printf-а, а char* встречается разве что в аргументах методов, принимающих параметры из-вне. А вот с Boost-ом авторы явно поскромничали, соответствующий вариант решения с использованием библиотек Boost был бы не лишним практически в каждой главе, а не только в избранных местах.

    Сообщений 3    Оценка 231        Оценить