Вы находитесь на странице: 1из 6

map и multimap в С++

Что это такое?

Как их создавать и использовать?

Какие методы работы с ними существуют?

Что такое map и multimap


Это ассоциативный контейнер, который работает по принципу — [ключ — значение].
Так же этот контейнер называется словарём или отображением.
Это множество состоящее из пар ключ-значение.
Словарь можно рассматривать как обобщение массива, но есть некоторые различия:
1. Ключом может быть все что угодно. От обычной переменной до класса.
2.
mp[ключ] = значение;
mp1[0] = 7; // ключ - число

mp2["zero"] = 4; // ключ - строка

pair <int, int> p = make_pair(1, 3);

mp3[p] = 3; // ключ - пара

3. При добавлении нового элемента контейнер будет отсортирован по возрастанию


ключей.
multimap отличается от map тем, что ключи в map уникальны, а в multimap
сохраняются дубликаты.
Как создать map multimap
Необходимо подключить библиотеку <map>

#include <map>

map < тип ключа, тип значения> имя словаря;
multimap < тип ключа, тип значения> имя словаря;

Например, с помощью map можно с легкостью сделать словарь:

 Ключом в нашем случае будет — русское слова.


 А значением — английское.
map <string, string> mp;

mp["привет"] = "hi";

При создании map все его элементы будут иметь значение нуля.

Также имеется возможность добавить значения при инициализации (С++ 11 и выше):

map <string, string> book = {{"Hi", "Привет"}, {"Student", "Студент"},


{"!", "!"}};

cout << book["Hi"];

Для строковых констант необходимы кавычки!

Итераторы для map


Использование итераторов одна из главных тем, если вам понадобится оперировать с
этим контейнером.
Создание итератора, как обычно происходит так:
map <тип данных> :: iterator имя итератора;

map <string, int> m;


map <string, int> :: iterator it;

С помощью его можно использовать две операции:


1. Чтобы обратится к ключу нужно сделать так: it->first .
2. Чтобы обратится к значению ячейки нужно сделать так: it->second .
Нельзя обращением к ключу (...->first) изменять его значение, а вот изменять таким
образом значение ячейки (...->second) легко.
Нельзя использовать никакие арифметические операции над итератором! Для
увеличения или уменьшения можно использовать только инкремент или декремент!
Нельзя делать то же самое используя операцию присваивания (it += 1) или вычитания
(it -= 1).

Чтобы не писать циклы для увеличения итератора на большие значения, можно


воспользоваться функцией advance() :

advance(it, 7);
advance(it, -5);

Она сдвигает указанный итератор вниз или вверх на указанное количество ячеек. В
нашем случае он сначала увеличит на 7, а потом уменьшит на 5, в итоге получится сдвиг
на две вверх.
Вывод контейнера
#include <iostream>
#include <map>

using namespace std;


int main() {
map <string, int> mp;
int n;
cin >> n;
for (int i = 1; i < =n; i++) {
string s;
cin >> s;
mp[s] = i; // добавляем элементы: слово – его порядковый номер
}
map < string , int> :: iterator it;
// *** вывод контейнера
for (it = mp.begin(); it != mp.end(); it++) {
cout << "ключ" << it->first;
cout << ", значение " << it->second;
}
return 0;
}

Методы map
insert
Это метод вставки нового элемента.

mp.insert (make_pair(ключ, значение));

Мы можем сделать то же самое вот так:

mp[ключ] = значение;

count
Возвращает количество элементов с данным ключом. В нашем случае будет возвращать
— 1 или 0.

Этот метод больше подходит для multimap, у которого элементов с одинаковыми


ключами может быть много.
mp[0] = 0;
int k;
k = mp.count(0); // 1
k = mp.count(3); // 0

find
У этого метода основное назначение узнать, есть ли определенный ключ в контейнере.

 Если он есть, то передать итератор на его местоположение.


 Если его нет, то передать итератор на конец контейнера.

#include <iostream>
#include <map> // подключили библиотеку

using namespace std;

int main() {
map <string, string> book;
book["book"] = "книга"; // добавили пару "book" - "книга"
map <string, string> :: iterator it;
it = book.find("book"); // определили итератор на ключ "book"
if (it == book.end()) { //если такого ключа нет, то есть it == book.end()
cout << "Ключа со значением 'books' нет";
}
else
cout << it -> second << endl;
return 0;
}

erase
erase удаляет элемент из контейнера

имя словаря .erase(итератор удаляемого элемента);


итератор может быть получен с помощью метода find

Возможно понадобиться изменить сторону сортировки в обратную (по-убыванию) для


этого можно сделать с помощью greater , вот так:

map <string, string, greater< string > > mp;

Плюсы и минусы: использования map


Плюсы:

 Ключом может быть любая переменная. Это огромный плюс, например если
придется делать словарь.
Минусы:
 Долгое добавление нового элемента.
 Долгое обращение к элементу.
 Долгое удаление нового элемента.
 Также слишком затратный по памяти
Все эти операции происходят за — log n ( n — это размер контейнера).
Подытожим:

1. Если вам требуется быстрый отклик программы, то если возможно


оперировать вектором либо массивом лучше использовать именно их.
2. Если же время не стоит на первом месте, то можно им пренебречь и использовать
map.
3. Типовая задача, с которой следует начинать изучать контейнер map:

Для каждого слова из этого текста подсчитайте, сколько раз оно


встречалось в этом тексте ранее.

Входные данные
Вводится текст.

Выходные данные
Выведите ответ на задачу.

Примеры
входные данные
one two one tho three

выходные данные
0 0 1 0 0
входные данные
She sells sea shells on the sea shore;
The shells that she sells are sea shells I'm sure.
So if she sells sea shells on the sea shore,
I'm sure that the shells are sea shore shells.

выходные данные
0 0 0 0 0 0 1 0 0 1 0 0 1 0 2 2 0 0 0 0 1 2 3 3 1 1 4 0 1 0 1 2 4 1 5 0 0

С использованием map задача решается элементарно. Так как в задаче не


известно количество слов, данные необходимо читать из файла. Создадим
map, ключом в котором будут слова, а значением количество слов,
которое уже встретилось ранее. Каждый раз, когда будем считывать
слово, будем выводить на экран значение элемента с ключом, равным
этому слову и увеличивать на 1.

4.

Литература
 Антти Лааксонен
Олимпиадное программирование. / пер. с англ. А.А. Слинкин – М.: ДМК Пресс,
2018. – 300 с.: ил
 https://codelessons.ru

Вам также может понравиться