Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// символьное представление
double d = stod(s); // преобразует строку s в значение типа double
Здесь для преобразования числа 42в его строковое представление используется вызов функции to_string(), а затем вызов функции stod()преобразует эту строку в значение с плавающей точкой.
Первый преобразуемый в числовое значение символ строки должен быть цифрой:
string s2 = "pi = 3.14";
// d = 3.14 преобразуется первая подстрока в строке s, начинающаяся
// с цифры; d = 3.14
d = stod(s2.substr(s2.find_first_of("+-.0123456789")));
Для получения позиции первого символа строки s, который мог быть частью числа, в этом вызове функции stod()используется функция find_first_of()(см. раздел 9.5.3). Функции stod()передается подстрока строки s, начиная с этой позиции. Функция stod()читает переданную строку до тех пор, пока не встретится символ, который не может быть частью числа. Затем найденное символьное представление числа преобразуется в соответствующее значение типа double.
Первый преобразуемый символ строки должен быть знаком +или -либо цифрой. Строка может начаться с части 0xили 0X, означающей шестнадцатеричный формат. У функций преобразования чисел с плавающей точкой строка может также начинаться с десятичной точки ( .) и содержать символ еили E, означающий экспоненциальную часть. У функций преобразования в целочисленный тип, в зависимости от основания, строка может содержать алфавитные символы, соответствующие цифрам после цифры 9.
Если строка не может быть преобразована в число, эти функции передают исключение invalid_argument(см. раздел 5.6). Если преобразование создает значение, которое не может быть представлено заданным типом, они передают исключение out_of_range.
Упражнение 9.50. Напишите программу обработки вектора vector, элементы которого представляют целочисленные значения. Вычислите сумму всех элементов вектора. Измените программу так, чтобы она суммировала строки, которые представляют значения с плавающей точкой.
Упражнение 9.51. Напишите класс, у которого есть три беззнаковых члена, представляющих год, месяц и день. Напишите конструктор, получающий строку, представляющую дату. Конструктор должен понимать множество форматов даты, такие как January 1,1900, 1/1/1900, Jan 1,1900 и т.д.
9.6. Адаптеры контейнеров
Кроме последовательных контейнеров, библиотека предоставляет три адаптера последовательного контейнера: stack(стек), queue(очередь) и priority_queue(приоритетная очередь). Адаптер (adaptor [4] Здесь и везде в оригинале именно adapt o r, а не adapt e r. — Примеч. ред .
) — это фундаментальная концепция библиотеки. Существуют адаптеры контейнера, итератора и функции. По существу, адаптер — это механизм, заставляющий нечто одно действовать как нечто другое. Адаптер контейнера получает контейнер существующего типа и заставляет его действовать как другой. Например, адаптер stackполучает любой из последовательных контейнеров ( arrayи forward_list) и заставляет его работать подобно стеку. Функции и типы данных, общие для всех адаптеров контейнеров, перечислены в табл. 9.17.
Таблица 9.17. Функции и типы, общие для всех адаптеров
size_type |
Тип данных, достаточно большой, чтобы содержать размер самого большого объекта этого типа |
value_type |
Тип элемента |
container_type |
Тип контейнера, на базе которого реализован адаптер |
A a; |
Создает новый пустой адаптер по имени a |
A a(c); |
Создает новый адаптер по имени а, содержащий копию контейнера с |
операторы сравнения |
Каждый адаптер поддерживает все операторы сравнения: ==, !=, <, <=, >и >=. Эти операторы возвращают результат сравнения внутренних контейнеров |
a.empty() |
Возвращает значение true, если адаптер апуст, и значение falseв противном случае |
a.size() |
Возвращает количество элементов в адаптере a |
swap(a, b) a.swap(b) |
Меняет содержимое контейнеров аи b; у них должен быть одинаковый тип, включая тип контейнера, на основании которого они реализованы |
Каждый адаптер определяет два конструктора: стандартный конструктор, создающий пустой объект, и конструктор, получающий контейнер и инициализирующий адаптер, копируя полученный контейнер. Предположим, например, что deq— это двухсторонняя очередь deque. Ее можно использовать для инициализации нового стека следующим образом:
stack stk(deq); // копирует элементы из deq в stk
По умолчанию оба адаптера, stackи queue, реализованы на основании контейнера deque, а адаптер priority_queueреализован на базе контейнера vector. Заданный по умолчанию тип контейнера можно переопределить, указав последовательный контейнер как второй аргумент при создании адаптера:
// пустой стек, реализованный поверх вектора
stack> str_stk;
// str_stk2 реализован поверх вектора и первоначально содержит копию
svec stack> str_stk2(svec);
Существуют некоторые ограничения на применение контейнеров с определенными адаптерами. Всем адаптерам нужна возможность добавлять и удалять элементы. В результате они не могут быть основаны на массиве. Точно так же нельзя использовать контейнер forward_list, поскольку все адаптеры требуют функций добавления, удаления и обращения к последнему элементу контейнера. Стек требует только функций push_back(), pop_back()и back(), поэтому для стека можно использовать контейнер любого из остальных типов. Адаптеру queueтребуются функции back(), push_back(), front()и push_front(), поэтому он может быть создан на основании контейнеров listи deque, но не vector. Адаптеру priority_queueв дополнение к функциям front(), push_back()и pop_back()требуется произвольный доступ к элементам; он может быть основан на контейнерах vectorи deque, но не list.
stackТип stackопределен в заголовке stack. Функции-члены класса stackперечислены в табл. 9.18. Следующая программа иллюстрирует использование адаптера stack:
stack intStack; // пустой стек
// заполнить стек
Интервал:
Закладка: