Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
double boeing_price = dow_price ["BA"];
if (dow_price.find("INTC") != dow_price.end()) // находим элемент
// ассоциативного
// массива
cout << "Intel is in the Down";
Перемещаться по ассоциативному массиву легко. Мы просто должны помнить, что ключ называется first, а значение — second.
typedef map<string,double>::const_iterator Dow_iterator;
// записывает цену акции для каждой компании, входящей в индекс
// Доу - Джонса
for (Dow_iterator p = dow_price.begin(); p!=dow_price.end(); ++p) {
const string& symbol = p–>first; // тикер
cout << symbol << 't'
<< p–>second << 't'
<< dow_name[symbol] << 'n';
}
Мы можем даже выполнить некоторые вычисления, непосредственно используя ассоциативный контейнер. В частности, можем вычислить индекс, как в разделе 21.5.3. Мы должны извлечь цены акций и веса из соответствующих ассоциативных массивов и перемножить их. Можно без труда написать функцию, выполняющую эти вычисления с любыми двумя ассоциативными массивами map<string,double>.
double weighted_value(
const pair<string,double>& a,
const pair<string,double>& b) // извлекает значения и перемножает
{
return a.second * b.second;
}
Теперь просто подставим эту функцию в обобщенную версию алгоритма
inner_product() и получим значение индекса.
double dji_index =
inner_product(dow_price.begin(), dow_price.end(),
// все компании
dow_weight.begin(), // их веса
0.0, // начальное значение
plus<double>(), // сложение (обычное)
weighted_value); // извлекает значение и веса,
// а затем перемножает их

ПОПРОБУЙТЕ
Приведите этот пример в рабочее состояние. Затем добавьте несколько компаний по своему выбору и задайте их веса.
21.6.4. Алгоритм unordered_map()



Реальная сложность поиска зависит от того, насколько быстро нам удастся найти искомые значения и какие затраты будут связаны с выполнением операции сравнения и итераций. Обычно следование за указателями (при поиске в контейнере map) несколько сложнее, чем инкрементация указателя (при поиске в контейнере vector с помощью алгоритма find()).

Рассмотрим графическую иллюстрацию поиска в (неупорядоченном) векторе, сбалансированном бинарном дереве и хеш-таблице.
• Поиск в неупорядоченном контейнере vector.

• Поиск в контейнере map (сбалансированном бинарном дереве).

• Поиск в контейнере unordered_map (хеш-таблица).

Контейнер unordered_map из библиотеки STL реализован с помощью хештаблицы, контейнер map — на основе сбалансированного бинарного дерева, а контейнер vector — в виде массива. Полезность библиотеки STL частично объясняется тем, что она позволила объединить в одно целое разные способы хранения данных и доступа к ним, с одной стороны, и алгоритмы, с другой.

• Используйте контейнер vector, если у вас нет веских оснований не делать этого.
• Используйте контейнер map, если вам необходимо выполнить поиск по значению (и если тип ключа позволяет эффективно выполнять операцию “меньше”).
• Используйте контейнер unordered_map, если вам необходимо часто выполнять поиск в большом ассоциативном массиве и вам не нужен упорядоченный обход (и если тип вашего ключа допускает эффективное использование хеш-функций).
Мы не будем подробно описывать контейнер unordered_map. Его можно использовать с ключом типа string или int точно так же, как контейнер map, за исключением того, что при обходе элементов они не будут упорядочены. Например, мы могли бы переписать фрагмент кода для вычисления индекса- Доу–Джонса из раздела 21.6.3 следующим образом:
unordered_map<string,double> dow_price;
typedef unordered_map<string,double>::const_iterator Dow_iterator;
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова