Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Глава 17
Специализированные средства библиотек
Последний стандарт существенно увеличил размер и область видимости библиотеки. Действительно, посвященная библиотеке часть стандарта более чем удвоилась по сравнению с прежним выпуском стандарта и составила почти две трети текста нового стандарта. В результате подробное рассмотрение каждого класса библиотеки С++ стало невозможным в данном издании. Однако четыре специализированных библиотечных средства являются достаточно общими, чтобы рассмотреть их в данной книге: это кортежи, наборы битов, генераторы случайных чисел и регулярные выражения. Кроме того, будут рассмотрены также некоторые дополнительные специальные средства библиотеки ввода и вывода.
17.1. Тип tuple
Шаблон
tuple
(кортеж) подобен шаблону pair
(пара) (см. раздел 11.2.3). У каждого экземпляра шаблона pair
могут быть члены разных типов, но их всегда только два. Члены экземпляров шаблона tuple
также могут иметь разные типы, но количество их может быть любым. Каждый конкретный экземпляр шаблона tuple
имеет фиксированное количество членов, но другой экземпляр типа может отличаться количеством членов.
Тип tuple
особенно полезен, когда необходимо объединить некие данные в единый объект, но нет желания определять структуру для их хранения. Список операций, поддерживаемых типом tuple
, приведен в табл. 17.1. Тип tuple
, наряду с сопутствующими ему типами и функциями, определен в заголовке tuple
.
Таблица 17.1. Операции с кортежами
tuple t; |
t — кортеж с количеством и типами членов, заданными списком T1...Tn . Члены инициализируются по умолчанию (см. раздел 3.3.1) |
tuple t(v1, v2, ..., vn); |
t — кортеж с типами T1...Tn , каждый член которого инициализируется соответствующим инициализатором vi . Этот конструктор является явным (см. раздел 7.5.4) |
make_tuple(v1, v2, ..., vn) |
Возвращает кортеж, инициализированный данными инициализаторов. Тип кортежа выводится из типов инициализаторов |
t1 == t2 t1 != t2 |
Два кортежа равны, если у них совпадает количество членов и каждая пара членов равна. Для сравнения используется собственный оператор == каждого члена. Как только найдены неравные члены, последующие не проверяются |
t1 опсравн t2 |
Операторы сравнения кортежей используют алфавитный порядок (см. раздел 9.2.7). У кортежей должно быть одинаковое количество членов. Члены кортежа t1 сравниваются с соответствующими членами кортежа t2 при помощи оператора < |
get(t) |
Возвращает ссылку i -ю переменную-член кортежа t ; если t — это l-значение, то результат — ссылка на l-значение; в противном случае — ссылка на r-значение. Все члены кортежа являются открытыми ( public ) |
tuple_size< типКортежа >::value |
Шаблон класса, экземпляр которого может быть создан по типу кортежа и имеет public constexpr static переменную-член value типа size_t , содержащую количество членов в указанном типе кортежа |
tuple_elementтипКортежа >::type |
Шаблон класса, экземпляр которого может быть создан по целочисленной константе и типу кортежа, имеющий открытый член type , являющийся типом указанного члена в кортеже указанного типа |
Тип
tuple
можно считать структурой данных на "скорую руку".
17.1.1. Определение и инициализация кортежей
При определении кортежа следует указать типы каждого из его членов:
tuple threeD; // все три члена установлены в 0
tuple, int, list>
someVal("constants", {3.14, 2.718}, 42, {0,1,2,3,4,5});
При создании объекта кортежа можно использовать либо стандартный конструктор кортежа, инициализирующий каждый член по умолчанию (см. раздел 3.3.1), либо предоставить инициализатор для каждого члена, как при инициализации кортежа someVal
. Этот конструктор кортежа является явным (см. раздел 7.5.4), поэтому следует использовать прямой синтаксис инициализации:
tuple threeD = {1,2,3}; // ошибка
tuple threeD{1,2,3}; // ok
В качестве альтернативы, подобно функции make_pair()
(см. раздел 11.2.3), можно использовать библиотечную функцию make_tuple()
, создающую объект кортежа:
// кортеж, представляющий транзакцию приложения книжного магазина:
// ISBN, количество, цена книги
auto item = make_tuple("0-999-78345-X", 3, 20.00);
Подобно функции make_pair()
, функция make_tuple()
использует типы, предоставляемые в качестве инициализаторов, для вывода типа кортежа. В данном случае кортеж item
имеет тип tuple
.
В типе pair
всегда есть два члена, что позволяет библиотеке присвоить им имена first
(первый) и second
(второй). Для типа tuple
такое соглашение об именовании невозможно, поскольку у него нет ограничений на количество членов. В результате члены остаются безымянными. Вместо имен для обращения к членам кортежа используется библиотечный шаблон функции get
. Чтобы использовать шаблон get
, следует определить явный аргумент шаблона (см. раздел 16.2.2), задающий позицию члена, доступ к которому предстоит получить. Функция get()
получает объект кортежа и возвращает ссылку на его заданный член:
auto book = get<0>(item); // возвращает первый член item
auto cnt = get<1>(item); // возвращает второй член item
auto price = get<2>(item)/cnt; // возвращает последний член item
get<2>(item) *= 0.8; // применяет 20%-ную скидку
Значение в скобках должно быть целочисленным константным выражением (см. разделе 2.4.4). Как обычно, счет начинается с 0, а значит, первым членом будет get<0>
.
Если подробности типов в кортеже неизвестны, для выяснения количества и типов его членов можно использовать два вспомогательных шаблона класса:
typedef decltype(item) trans; // trans - тип кортежа item
// возвращает количество членов в объекте типа trans
size_t sz = tuple_size::value; // возвращает 3
// cnt имеет тот же тип, что и второй член item
tuple_element<1, trans>::type cnt = get<1>(item); // cnt - это int
Для использования шаблонов tuple_size
и tuple_element
необходимо знать тип объекта кортежа. Как обычно, проще всего определить тип объекта при помощи спецификатора decltype
(см. раздел 2.5.3). Здесь спецификатор decltype
используется для определения псевдонима для типа кортежа item
, который и используется при создании экземпляров обоих шаблонов.
Интервал:
Закладка: