Шаг 96.
Библиотека STL.
Отображение как ассоциативный массив

    На этом шаге мы рассмотрим связь отображений и ассоциативных массивов.

    Если в примере предыдущего шага заменить multimap на map, программа выведет те же данные без дубликатов (значения могут быть теми же). С другой стороны, набор пар "ключ/значение" с уникальными ключами также можно рассматривать как ассоциативный массив. Рассмотрим следующий пример:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <map>
#include <conio.h> //необходимо для getch()
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;
std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}

int main(int argc, char* argv[])
{
  // Тип контейнера:
  // - map: элементами являются пары "ключ/значение"
  // - string: ключи относятся к типу string
  // - float: значения относятся к типу float

  typedef map <string,float> StringFloatMap;
  StringFloatMap coll;

  // Вставка элементов в коллекции
  coll["VAT"] = 0.15;
  coll["Pi"] = 3.1415;
  coll["an arbitrary number"] = 4983.223;
  coll["Null"] = 0;

  // Вывод содержимого коллекции
  // - перебор всех элементов
  // - компонент first содержит ключ
  // - компонент second содержит значение
  StringFloatMap::iterator pos;
  for (pos = coll.begin(); pos != coll.end(); ++pos) {
    cout << "key: \"" << pos->first << "\" "
         << "value: " << pos->second << endl;
  }

  getch();
  return 0;
}
//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    В объявлении типа контейнера должны быть указаны оба типа (ключа и значения):

  typedef map<string,float> StringFloatMap;

    При работе с отображениями операция вставки может осуществляться оператором индексирования []:

  coll["VAT"] = 0.15;
  coll["Pi"] = 3.1415;
  coll["an arbitrary number"] = 4983.223;
  coll["Null"] = 0;

    Индекс используется в качестве ключа и может иметь произвольный тип. Такой интерфейс типичен для ассоциативных массивов. Ассоциативным массивом называется массив, индекс которого может относиться к произвольному типу (не обязательно числовому).

    Обратите внимание: оператор индексирования в данном случае работает не так, как обычный оператор индексирования массивов. Отсутствие элемента, связанного с индексом, не является ошибкой. При появлении нового индекса (или ключа) создается и вставляется в контейнер новый элемент, ключом которого является указанный индекс. Таким образом, в ассоциативных массивах индекс в принципе не может принимать недопустимое значение. Следовательно, в показанной ниже команде из рассмотренного примера создается новый элемент с ключом "Null":

  coll["Null"] = 0;

    Оператор присваивания связывает этот ключ со значением 0, преобразованным к типу float.

    Оператор индексирования не может использоваться с мультиотображениями. Мультиотображение допускает наличие нескольких элементов с одинаковыми ключами, поэтому оператор индексирования, работающий только с одним значением, в этом случае оказывается бесполезным. Как показывает пример из предыдущего шага, при вставке элементов в мультиотображение необходимо конструировать пары "ключ/значение". Такой способ подходит и для отображений.

    При обращении к ключу и значению элемента мультиотображения, как и в случае с отображениями, используются компоненты first и second структуры pair. Результат работы программы выглядит так:


Рис.1. Результат работы приложения

    На следующем шаге мы рассмотрим категории итераторов.




Предыдущий шаг Содержание Следующий шаг