Шрифт:
Интервал:
Закладка:
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;