Контейнер map в языке C++ позволяет работать сразу с 2 значениями. Каждый из элементов пары может иметь свой тип. Одним из основных способов использования map является создание ассоциативного массива. Это означает, что один из элементов пары становится ключом, по которому можно извлечь второй элемент, хранящий какую-либо информацию. Приведем пример
1 2 3 4 5 6 |
#include <map> map <string,int> Mv = {{ "Winter", 11 }, { "Spring", 4 }, { "Summer", 6 }, { "Autumn", 10 }}; |
В примере мы явно задали массив в данном контейнере, добавив в него 4 пары элементов. Все пары соответствуют изначально заданным типам <string,int>. В дальнейшем работа с Mv идет, как и с любым другим контейнером, посредством стандартных функций. Например,
1 2 3 4 5 |
Mv.insert ( pair< string,int >(c,i) ); for (auto it = Mv.begin(); it != Mv.end(); ++it) { cout << (*it).first << " : " << (*it).second << endl; } |
Первой строкой мы добавляем еще одну пару элементов. Обязательно, чтобы пара имела такие же типы, что и Mv. В строчках 2-5 с помощью цикла выводятся на экран все пары элементов в контейнере, каждая пара на новой строке и разделена “:”. Первый и второй элементы пары вызываются (*it).first и (*it).second соответственно. Mv.begin() и Mv.end() указывают на начало и конец массива элементов контейнера. Map автоматически сортирует значения в массиве, и не позволяет добавлять идентичные пары. Это решается путем использования multimap:
1 |
multimap <string,int> Mv; |
Функционал контейнера map:
- Работа с памятью:
- Mv.size() - размер контейнера,
- Mv.max_size() - максимальный размер контейнера.
- Работа с контейнером:
- Mv.begin() - указатель на начало контейнера,
- Mv.end() - указатель на конец контейнера,
- Mv.rbegin() - реверсивный указатель на конец контейнера,
- Mv.rend() - реверсивный указатель на начало контейнера.
- Работа с элементами map:
- Mv.swap(Mv2) – меняет содержимое контейнеров местами,
- Mv.insert(e) - вставка элемента,
- Mv.erase(Mv2) - удаляет последовательность элементов,
- Mv[i] или Mv.at(i) доступ к элементу i контейнера,
- Mv.clear() - очистка контейнера map,
- Mv.count() - количество элементов в контейнере,
- Mv.find(a) - найти элемент в контейнере,
- Mv.lower_bound(a) - первый элемент, не меньший чем a,
- Mv.upper_bound(a) - первый элемент, больший чем a,
- Mv.equal_range(a) - пара элементов, первый - нижняя граница элементов с, такими же значениями, что и a, второй - верхняя граница элементов с такими же значениями, что и a,
- Mv.key_comp() - сортировка элементов в контейнере по ключу,
- Mv.value_comp() - сортировка элементов в контейнере по значению.
Примеры использования этого функционала:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <map> // подключаем map #include <string> // подключаем строки string #include <iostream> // подключаем cout using namespace std; // чтобы не писать std:: int main() { map <string,int> Mv; // инициализация map Mv.insert(pair<string,int>("January",31)); Mv.insert(pair<string,int>("February",28)); Mv.insert(pair<string,int>("March",31)); Mv.insert(pair<string,int>("April",30)); cout<<Mv.size()<<'\n'; // будет выведено 4 cout<<Mv.max_size()<<'\n'; cout<<(*(Mv.begin())).first<<'\n'; // April cout<<(*(Mv.end())).first<<'\n'; // NULL cout<<(*(Mv.rbegin())).first<<'\n'; // March cout<<(*(Mv.rend())).first<<'\n'; // January cout<<Mv["January"]<<'\n'; // 31 cout<<Mv.count("January")<<'\n'; // 1 cout<<(*Mv.lower_bound("January")).first<<'\n'; // January cout<<(*Mv.upper_bound("January")).first<<'\n'; // March cout<<((Mv.equal_range("January")).first)->first<<'\n'; // January cout<<((Mv.equal_range("January")).second)->first<<'\n'; // March cout<<(*Mv.find("January")).first<<'\n'; // January cout<<Mv.key_comp()("January","April")<<'\n'; // 0 (т.е. >) cout<<Mv.value_comp()(*Mv.rbegin(),*Mv.rend())<<'\n'; // 0 (т.е. >) Mv.erase("January"); cout<<Mv.count("January")<<'\n'; // 0 Mv.clear(); cout<<Mv.size()<<'\n'; // 0 cin.get(); // ожидаем нажатие пользователем клавиши return 0; // выдаём 0 - правило хорошего тона } |