Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Шаблон tuple_size
обладает открытой статической переменной-членом value
, содержащей количество членов в указанном кортеже. Шаблон tuple_element
получает индекс, а также тип кортежа. Он обладает открытым типом-членом type
, содержащим тип указанного члена кортежа заданного типа. Подобно функции get()
, шаблон tuple_element
ведет отсчет индексов начиная с нуля.
Операторы сравнения и равенства кортежей ведут себя подобно соответствующим операторам контейнеров (см. раздел 9.2.7). Эти операторы выполняются для членов двух кортежей, слева и справа. Сравнить два кортежа можно только при совпадении количества их членов. Кроме того, чтобы использовать операторы равенства или неравенства, должно быть допустимо сравнение каждой пары членов при помощи оператора ==
; а для использования операторов сравнения допустимым должно быть использование оператора <
. Например:
tuple duo("1", "2");
tuple twoD(1, 2);
bool b = (duo == twoD); // ошибка: нельзя сравнить size_t и string
tuple threeD(1, 2, 3);
b = (twoD < threeD); // ошибка: разное количество членов
tuple origin(0, 0);
b = (origin < twoD); // ok: b — это true
Поскольку кортеж определяет операторы
<
и ==
, последовательности кортежей можно передавать алгоритмам, а также использовать кортеж как тип ключа в упорядоченном контейнере.
Упражнение 17.1. Определите кортеж, содержащий три члена типа int
, и инициализируйте их значениями 10
, 20
и 30
.
Упражнение 17.2. Определите кортеж, содержащий строку, вектор строки и пару из строки и целого числа (типы string
, vector
и pair
).
Упражнение 17.3. Перепишите программы TextQuery
из раздела 12.3 так, чтобы использовать кортеж вместо класса QueryResult
. Объясните, что на ваш взгляд лучше и почему.
17.1.2. Использование кортежей для возвращения нескольких значений
Обычно кортеж используют для возвращения из функции нескольких значений. Например, рассматриваемый книжный магазин мог бы быть одним из нескольких магазинов в сети. У каждого магазина был бы транзакционный файл, содержащий данные по каждой проданной книге. В этом случае могло бы понадобиться просмотреть все продажи данной книги по всем магазинам.
Предположим, для каждого магазина имеется файл транзакций. Каждый из этих транзакционных файлов в магазине будет содержать все транзакции для каждой группы книг. Предположим также, что некая другая функция читает эти транзакционные файлы, создает вектор vector
для каждого магазина и помещает эти векторы в вектор векторов:
// каждый элемент в файле содержит транзакции
// для определенного магазина
vector> files;
Давайте напишем функцию, которая будет просматривать файлы в поисках магазина, продавшего заданную книгу. Для каждого магазина, у которого есть соответствующая транзакция, необходимо создать кортеж для содержания индекса этого магазина и двух итераторов. Индекс будет позицией соответствующего магазина в файлах, а итераторы отметят первую и следующую после последней записи по заданной книге в векторе vector
этого магазина.
Для начала напишем функции поиска заданной книги. Аргументами этой функции будет только что описанный вектор векторов и строка, представляющая ISBN книги. Функция будет возвращать вектор кортежей с записями по каждому магазину, где была продана по крайней мере одна заданная книга:
// matches имеет три члена: индекс магазина и итераторы в его векторе
typedef tuple::size_type,
vector::const_iterator,
vector::const_iterator> matches;
// files хранит транзакции по каждому магазину
// findBook() возвращает вектор с записями для каждого магазина,
// продавшего данную книгу
vector
findBook(const vector> &files,
const string &book) {
vector ret; // изначально пуст
// для каждого магазина найти диапазон, соответствующий книге
// (если он есть)
for (auto it = files.cbegin(); it != files.cend(); ++it) {
// найти диапазон Sales_data с тем же ISBN
auto found = equal_range(it->cbegin(), it->cend(),
book, compareIsbn);
if (found.first != found.second) // у этого магазина есть продажи
// запомнить индекс этого магазина и диапазона соответствий
ret.push_back(make_tuple(it - files.cbegin(),
found.first, found.second));
}
return ret; // пуст, если соответствий не найдено
}
Цикл for
перебирает элементы вектора files
, которые сами являются векторами. В цикле for
происходит вызов библиотечного алгоритма equal_range()
, работающего как одноименная функция-член ассоциативного контейнера (см. раздел 11.3.5). Первые два аргумента функции equal_range()
являются итераторами, обозначающими исходную последовательность (см. раздел 10.1). Третий аргумент — значение. По умолчанию для сравнения элементов функция equal_range()
использует оператор <
. Поскольку тип Sales_data
не имеет оператора <
, передаем указатель на функцию compareIsbn()
(см. раздел 11.2.2).
Алгоритм equal_range()
возвращает пару итераторов, обозначающих диапазон элементов. Если книга не будет найдена, то итераторы окажутся равны, означая, что диапазон пуст. В противном случае первый член возвращенной пары обозначит первую соответствующую транзакцию, а второй — следующую после последней.
После создания вектора магазинов с соответствующей транзакцией эти транзакции необходимо обработать. В данной программе следует сообщить результаты общего объема продаж для каждого магазина, у которого была такая продажа:
void reportResults(istream &in, ostream &os,
const vector> &files) {
string s; // искомая книга
while (in >> s) {
auto trans = findBook(files, s);
// магазин, продавший эту книгу
if (trans.empty()) {
cout << s << " not found in any stores" << endl;
continue; // получить следующую книгу для поиска
}
for (const auto &store : trans) // для каждого магазина с
// продажей
// get возвращает указанный элемент кортежа в store
os << "store " << get<0>(store) << " sales: "
<< accumulate(get<1>(store), get<2>(store),
Sales_data(s))
<< endl;
}
}
Цикл while
последовательно читает поток istream
по имени in
, чтобы запустить обработку следующей книги. Вызов функции findBook()
позволяет выяснить, присутствует ли строка s
, и присваивает результаты вектору trans
. Чтобы упростить написание типа trans
, являющегося вектором кортежей, используем ключевое слово auto
.
Интервал:
Закладка: