// записывает цену акции для каждой компании, входящей в индекс
// Доу - Джонса
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
double weighted_value(
const pair
const pair
) // извлекает значения и перемножает
{
return a.second * b.second;
}
Теперь просто подставим эту функцию в обобщенную версию алгоритма
inner_product и получим значение индекса.
double dji_index =
inner_product(dow_price.begin, dow_price.end,
// все компании
dow_weight.begin, // их веса
0.0, // начальное значение
plus
weighted_value); // извлекает значение и веса,
// а затем перемножает их
map
dow
мы выводили символы в алфавитном порядке; если бы мы использовали класс vector
, то были бы вынуждены сортировать его. Чаще всего класс map
используют просто потому, что хотят искать значения по их ключам. Для крупных последовательностей поиск элементов с помощью алгоритма find
намного медленнее, чем поиск в упорядоченной структуре, такой как контейнер map
.ПОПРОБУЙТЕ
Приведите этот пример в рабочее состояние. Затем добавьте несколько компаний по своему выбору и задайте их веса.
21.6.4. Алгоритм unordered_map
vector
find
должен проверить все элементы, начиная с первого и заканчивая искомым или последним элементом вектора. Средняя сложность этого поиска пропорциональна длине вектора (
Реальная сложность поиска зависит от того, насколько быстро нам удастся найти искомые значения и какие затраты будут связаны с выполнением операции сравнения и итераций. Обычно следование за указателями (при поиске в контейнере map) несколько сложнее, чем инкрементация указателя (при поиске в контейнере vector с помощью алгоритма find