Иллюстрированный самоучитель по Visual Studio.Net

         

Контейнеры типа map


Отображение (map) является сортируемым ассоциативным контейнером, который ассоциирует объекты типа key с объектами типа value. Map — это Pair Associative Container, так как он хранит пары типа pair<const Key, Data>. Говорят также о Unique Associative Container, имея в виду, что в контейнере типа тар не может быть одинаковых элементов. Отображения являются одними из самых мощных и удобных типов контейнеров. Рассмотрим их работу на примерах. Не забудьте вставить директиву #include <map>:

void main ()

{

//========= Создаем отображение строки в целое

map<string,int> m;

map<string,int>::_Pairib pib;

map<string,int>::iterator it;

//========= Создаем новый тип для удобства

typedef pair<string, int> MyPair; MyPair p("Monday", 1); m.insert(p);

//========= Изменяем компоненты пары

p.first = "Tusday";

p.second = 2;

pib = m.insert(p);

cout « "\n\nlnserting: "

« (*pib.first).first « ","



« (*pib.first).second

« "\nResult is: " « pib.second;

pib = m.insert(p);

cout « "\n\nlnserting: "

« (*pib.first).first « ","

« (*pib.first).second

« "\nResult is: " « pib.second;

//========= Работаем с индексом

m["Wednesday"] = 3;

m["Thirsday"] = 4;

m["Friday"] = 5;

//========= Работаем с динамической памятью

MyPair *pp = new MyPair("Saturday", 6);

m.iftsert(*pp);

delete pp;

cout«"\n\n\t <string,int> pairs :\n";

for (it = m.begin ();

if != m.end(); it++)

cout « "\n(" « it->first«","<<it->second«") ";

cout«"\n\n";

}

Результат работы этого фрагмента выглядит так:

Inserting: Tusday, 2 Result is: 1

Inserting: Tusday, 2 Result is: 0

<string,int> pairs:

(Friday, 5) (Monday, 1) (Saturday, 6) (Thirsday, 4) (Tusday, 2) (Wednesday, 3)

Как видите, пары отсортированы в лексикографическом порядке. Если потребуется восстановить естественный порядок, то это можно сделать, поменяв порядок следования аргументов при объявлении шаблона на

map<int, string> m;

Такую замену придется сделать и для всех других, связанных с шаблоном типов данных. Отметьте также, что при работе с отображениями недостаточно разадресо-вать итератор (*it), чтобы получить объект им указываемый. Теперь вы должны писать (*it) .first или it->first, чтобы получить какой-то объект. Характерно, что эти выражения могут стоять как в левой, так и в правой части операции присвоения, то есть вы можете записать:

it->first = "Sunday";

int n = it->second;



Содержание раздела