Иллюстрированный самоучитель по 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;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.