Отображение как ассоциативный массив

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

   
Если в примере предыдущего шага заменить 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. Результат работы приложения

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий