На этом шаге мы рассмотрим пример мультиотображения.
Элементами отображений и мультиотображений являются пары "ключ/значение", поэтому синтаксис объявления, вставки и обращения
к элементам несколько изменяется. Пример использования мультиотображения:
//--------------------------------------------------------------------------- #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[]) { // Тип коллекции typedef multimap <int,string> IntStringMMap; IntStringMMap coll; // Контейнер для хранения пар int/string // Вставка элементов в произвольном порядке // - значение с ключом 1 вставляется дважды. coll.insert(make_pair(5,"нами")); coll.insert(make_pair(2,"строки")); coll.insert(make_pair(1,"Эти")); coll.insert(make_pair(4,"созданному")); coll.insert(make_pair(6, "мультиотображению")); coll.insert(make_pair(1,"Вот эти")); coll.insert(make_pair(3,"принадлежат")); // Вывод содержимого контейнера // - перебор всех элементов // - переменная second содержит значение. IntStringMMap::iterator pos; cout << ToRus("Мультиотображение:\n"); for (pos=coll.begin(); pos != coll.end(); ++pos) { cout << ToRus(pos->second) << ' '; } cout << endl; getch(); return 0; } //---------------------------------------------------------------------------
Текст этого примера можно взять 94 шаге, можно заметить два основных различия.
- Элементы представляют собой пары "ключ/значение", поэтому для вставки элемента в коллекцию необходимо создать объект pair.
Задача решается с помощью вспомогательной функции make_pair(). - Итератор ссылается на пару "ключ/значение", поэтому мы не можем просто направить его в выходной поток данных. Вместо этого приходится
работать с отдельными членами структуры pair, которым присвоены имена first и second (тип pair представлен
на 56 шаге). Следовательно, выражение pos->second определяет второй компонент пары "ключ/значение",
то есть значение элемента мультиотображения. Как и в случае с обычными указателями, это выражение представляет собой сокращенную запись
для (*pos).second. Аналогичное выражение pos->first определяет первый компонент пары "ключ/значение"; в нашем примере
это ключ элемента мультиотображения. Мультиотображения также могут использоваться в качестве словарей.
На следующем шаге мы рассмотрим отображение как ассоциативный массив.