Контейнер map библиотеки STL в C++

Курс по структурам данных: https://stepik.org/a/134212

На этом занятии рассмотрим реализацию карт (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:

ar.emplace("to", 4);

здесь попросту указывается ключ и его значение. Кроме того, этот метод работает несколько быстрее, чем метод insert().

Далее, если требуется удалить какой-либо ключ, то для этого можно воспользоваться методом erase():

auto it = ar.erase("dos");

Данный метод возвращает булево значение false, если удаление ключа по каким-либо причинам не было выполнено и true в противном случае.

Для поиска элемента по ключу используется метод find():

auto it = ar.find("dos");

Данный метод возвращает итератор на пару ключ-значение, если указанный ключ был найден, либо значение ar.end(), если ключ не найден.

Вот основные методы при работе с контейнером map. Он очень похож на контейнер set и содержит набор схожих методов.

Курс по структурам данных: https://stepik.org/a/134212

Видео по теме