На этом занятии рассмотрим реализацию карт
(map) библиотеки STL языка С++. Контейнер
map очень похож на
ранее рассмотренный контейнер set (множества) с тем лишь отличием, что в map мы сохраняем
данные в формате «ключ-значение», например, так:
#include <iostream>
#include <map>
int main()
{
setlocale(LC_ALL, "ru");
using namespace std;
map<string, int> ar;
ar["do"] = 1;
ar["to"] = 2;
ar["dog"] = 3;
ar["dogs"] = 4;
return 0;
}
Здесь вначале
подключается заголовок map и после этого в функции main() становится
доступен класс map. В угловых скобках прописывается тип для ключа, а
затем, для значения. В примере я указал тип string (строка) для
ключей и тип int (целочисленный)
– для значений. После этого можно в коллекцию через операторы квадратные скобки
([]) добавлять связки «ключ-значение». В программе добавлены четыре таких пары:
«do=>1», «to=>2», «dog=>3», «dogs=>4».
Если указанного
ключа не было в коллекции, то он добавляется, иначе, его значение перезаписывается.
То есть, ключи в коллекции map уникальны и не повторяются.
Также как и set, контейнер map представляется
в виде бинарного дерева, с упорядочиванием вершин по ключам. В частности, для
пар «do=>1», «to=>2», «dog=>3», «dogs=>4» дерево
будет иметь вид:
Здесь следует
учитывать, что строки сравниваются на больше и меньше в лексикографическом
порядке. Если теперь вывести ключи этого дерева (коллекции map) в консоль:
for (auto& item : ar)
{
cout << item.first << endl;
}
То увидим их возрастающую
последовательность.
Помимо оператора
квадратные скобки добавление новой пары ключ-значение можно выполнить с помощью
метода insert, следующими
способами:
ar.insert(pair<string, int>("do", 1));
ar.insert(make_pair("dos", 3));
В первом
варианте мы явно формируем объект pair с ключом «do» и значением 1,
а во втором варианте вызываем вспомогательную функцию make_pair() для
формирования того же объекта pair. Однако, добавить новую пару
ключ-значение удобнее с помощью метода emplace:
здесь попросту
указывается ключ и его значение. Кроме того, этот метод работает несколько
быстрее, чем метод insert().
Далее, если
требуется удалить какой-либо ключ, то для этого можно воспользоваться методом erase():
auto it = ar.erase("dos");
Данный метод
возвращает булево значение false, если удаление ключа по каким-либо
причинам не было выполнено и true в противном случае.
Для поиска
элемента по ключу используется метод find():
auto it = ar.find("dos");
Данный метод
возвращает итератор на пару ключ-значение, если указанный ключ был найден, либо
значение ar.end(), если ключ не
найден.
Вот основные
методы при работе с контейнером map. Он очень похож на контейнер set и содержит набор
схожих методов.