Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Если вектор trans
пуст, значит, по книге s
никаких продаж не было. В таком случае выводится сообщение и происходит возврат к циклу while
, чтобы обработать следующую книгу.
Цикл for
свяжет ссылку store
с каждым элементом вектора trans
. Поскольку изменять элементы вектора trans
не нужно, объявим ссылку store
ссылкой на константу. Для вывода результатов используем get
: get<0>
— индекс соответствующего магазина; get<1>
— итератор на первую транзакцию; get<2>
— на следующую после последней.
Поскольку класс Sales_data
определяет оператор суммы (см. раздел 14.3), для суммирования транзакций можно использовать библиотечный алгоритм accumulate()
(см. раздел 10.2.1). Как отправную точку суммирования используем объект класса Sales_data
, инициализированный конструктором Sales_data()
, получающим строку (см. раздел 7.1.4). Этот конструктор инициализирует переменную-член bookNo
переданной строкой, а переменные-члены units_sold
и revenue
— нулем.
Упражнение 17.4. Напишите и проверьте собственную версию функции findBook()
.
Упражнение 17.5. Перепишите функцию findBook()
так, чтобы она возвращала пару, содержащую индекс и пару итераторов.
Упражнение 17.6. Перепишите функцию findBook()
так, чтобы она не использовала кортеж или пару.
Упражнение 17.7. Объясните, какую версию функции findBook()
вы предпочитаете и почему.
Упражнение 17.8. Что будет, если в качестве третьего параметра алгоритма accumulate()
в последнем примере кода этого раздела передать объект класса Sales_data
?
17.2. Тип bitset
В разделе 4.8 приводились встроенные операторы, рассматривающие целочисленный операнд как коллекцию битов. Для облегчения использования битовых операций и обеспечения возможности работы с коллекциями битов, размер которых больше самого длинного целочисленного типа, стандартная библиотека определяет класс bitset
(набор битов). Класс bitset
определен в заголовке bitset
.
17.2.1. Определение и инициализация наборов битов
Список конструкторов типа bitset
приведен в табл. 17.2. Тип bitset
— это шаблон класса, который, подобно классу array
, имеет фиксированный размер (см. раздел 3.3.6). При определении набора битов следует указать в угловых скобках количество битов, которые он будет содержать:
bitset<32> bitvec(1U); // 32 бита; младший бит 1, остальные биты 0
Размер должен быть указан константным выражением (см. раздел 2.4.4). Этот оператор определяет набор битов bitvec
, содержащий 32 бита. Подобно элементам вектора, биты в наборе битов не имеют имен. Доступ к ним осуществляется по позиции. Нумерация битов начинается с 0. Таким образом, биты набора bitvec
пронумерованы от 0 до 31. Биты, расположенные ближе к началу (к 0), называются младшими битами (low-order), а ближе к концу (к 31) — старшими битами (high-order).
Таблица 17.2. Способы инициализации набора битов
bitset b; |
Набор b содержит n битов, каждый из которых содержит значение 0. Это конструктор constexpr (см. раздел 7.5.6) |
bitset b(u); |
Набор b содержит копию n младших битов значения u типа unsigned long long . Если значение n больше размера типа unsigned long long , остальные старшие биты устанавливаются на нуль. Это конструктор constexpr (см. раздел 7.5.6) |
bitset b(s, рos, m, zero, one); |
Набор b содержит копию m символов из строки s , начиная с позиции pos . Строка s может содержать только символы для нулей и единиц; если строка s содержит любой другой символ, передается исключение invalid_argument . Символы хранятся в наборе b как нули и единицы соответственно. По умолчанию параметр pos имеет значение 0, параметр m — string::npos , zero — '0' и one — '1' |
bitset b(cp, pos, m, zero, one); |
Подобен предыдущему конструктору, но копируется символьный массив, на который указывает cp . Если значение m не предоставлено, cp должен указывать на строку в стиле С. Если m предоставлено, то начиная с позиции cp в массиве должно быть по крайней мере m символов, соответствующих нулям или единицам |
Конструкторы, получающие строку или символьный указатель, являются явными (см. раздел 7.5.4). В новом стандарте была добавлена возможность определять альтернативные символы для 0 и 1. |
---|
При использовании для инициализации набора битов целочисленного значения оно преобразуется в тип unsigned long long
и рассматривается как битовая схема. Биты в наборе битов являются копией этой схемы. Если размер набора битов превосходит количество битов в типе unsigned long long
, то остальные старшие биты устанавливаются в нуль. Если размер набора битов меньше количества битов, то будут использованы только младшие биты предоставленного значения, а старшие биты вне размера объекта набора битов отбрасываются:
// bitvec1 меньше инициализатора; старшие биты инициализатора
// отбрасываются
bitset<13> bitvec1(0xbeef); // биты 1111011101111
// bitvec2 больше инициализатора; старшие биты bitvec2
// устанавливаются в нуль
bitset<20> bitvec2(0xbeef); // биты 00001011111011101111
// на машинах с 64-битовым long long, 0ULL - это 64 бита из 0,
// a ~0ULL - 64 единицы
bitset<128> bitvec3(~0ULL); // биты 0...63 - единицы; 63...121 - нули
Набор битов можно инициализировать из строки или указателя на элемент в символьном массиве. В любом случае символы непосредственно представляют битовую схему. Как обычно, при использовании строки для представления числа символы с самыми низкими индексами в строке соответствуют старшим битам, и наоборот:
bitset<32> bitvec4("1100"); // биты 2 и 3 - единицы, остальные - 0
Если строка содержит меньше символов, чем битов в наборе, старшие биты устанавливаются в нуль.
Соглашения по индексации строк и наборов битов прямо противоположны: символ строки с самым высоким индексом (крайний правый символ) используется для инициализации младшего бита в наборе битов (бит с индексом 0). При инициализации набора битов из строки следует помнить об этом различии.
Необязательно использовать всю строку в качестве исходного значения для набора битов, вполне можно использовать часть строки:
Читать дальшеИнтервал:
Закладка: