При помощи функции map::at()
, зная «ключ», всегда можно изменить «значение» map
. Пример:
#include <iostream> #include <map> using namespace std; int main() { map <string,int> myMap = {{ "Beta", 2 }, ///явная инициализация map { "Alpha", 1 }, { "Gamma", 3 }}; ///присвоение элементам map новых значений myMap.at("Beta") = 0; myMap.at("Alpha") = 233; myMap.at("Gamma") = -45; cout << "myMap contains:\n"; for(auto it = myMap.begin(); it != myMap.end(); ++it) { cout << it->first << " : " << it->second << endl;///вывод на экран } multimap <char,int> myMultimap;///объявили multimap ///заполняем myMultimap myMultimap.insert ( pair<char,int>('q',111) ); myMultimap.insert ( pair<char,int>('u',201) ); myMultimap.insert ( pair<char,int>('h',301) ); cout << "\nmyMultimap contains:\n"; for (auto it = myMultimap.begin(); it != myMultimap.end(); ++it) { cout << it->first << " : " << it->second << endl; } myMap.clear(); myMultimap.clear(); ///новая инициализация myMap myMap = {{ "Mike", 40 }, { "Walle", 999 }, { "Cloude", 17 }}; ///новая инициализация myMultimap myMultimap.insert ( pair<char,int>('q',222) ); myMultimap.insert ( pair<char,int>('u',223) ); myMultimap.insert ( pair<char,int>('h',221) ); auto itMap = myMap.begin();///создаем итератор на начало myМap auto itMultimap = myMultimap.begin();///создаем итератор на начало myMultimap cout << "\nmyMap after clear contains: \t myMultimap after clear contains:\n"; ///вывод на экран myMap и myMultimap for(itMap = myMap.begin(),itMultimap = myMultimap.begin(); itMultimap != myMultimap.end(); itMap++,itMultimap++) { cout << "\t" <<itMap->first << " : " << itMap->second << "\t\t\t\t" << itMultimap->first << " : " << itMultimap->second << endl; } return 0; }
Выполнение программы:
myMap contains:
Alpha : 233
Beta : 0
Gamma : -45
myMultimap contains:
a : 301
b : 111
c : 201
myMap after clear contains: myMultimap after clear contains:
Cloude : 17 h : 221
Mike : 40 q : 222
Vally : 999 u : 223
В строках 7 по 9 происходит явная инициализация контейнера map. Т. к. каждому «ключу» соответствует единственное «значение», то в строках 12-14 при помощи функции map::at()
, используя «ключ», мы изменяем установленное «значение». Вывод осуществляемый в строках 17-20, наглядно демонстрирует это. Multimap
не поддерживает функцию map::at()
.
В 22 строке объявили контейнер multumap
, который принимает два типа переменных char
и int
. В строках 25-27 производим заполнение контейнера multimap
, а в строках 30-33 осуществляем вывод. В строке 35, 36 при помощи функции map::clear()
, производится очистка контейнера multimap
и map
. В строках 39-41 и 44-46 производится заполнение контейнеров multimap
и map
новыми значениями. В строке 48, 49 создается итератор itMap
указывающий на начало myMap
и итератор itMultimap
, указывающий на начало myMultimap
. В строках 53-56 соответственно производится вывод map
и multimap
с новыми значениями.
Контейнеры multimap
и map
содержат функцию которая позволяет выполнять поиск заданного элемента по контейнеру, пример:
#include <iostream> #include <map> using namespace std; int main() { multimap <char,int> myMultimap; map <char,int> myMap; char c; for (int i = 0,c = 'a'; i < 5; ++i,++c) { myMap[c] = i;///заполняем map } ///заполняем multimap myMultimap.insert ( pair<char,int>('c',146) ); myMultimap.insert ( pair<char,int>('a',23) ); myMultimap.insert ( pair<char,int>('b',996) ); myMultimap.insert ( pair<char,int>('a',56) ); myMultimap.insert ( pair<char,int>('c',121) ); auto itMap = myMap.begin();///создаем итератор на начало myМap auto itMultimap = myMultimap.begin();///создаем итератор на начало myMultimap cout<<"myMap contains: \t myMultimap contains:\n"; ///вывод на экран myMap и myMultimap for(itMap = myMap.begin(),itMultimap = myMultimap.begin(); itMultimap != myMultimap.end(); itMap++,itMultimap++) { cout << itMap->first << " : " << itMap->second << "\t\t\t\t" << itMultimap->first << " : " << itMultimap->second << endl; } for(c = 'a'; c <= 'f'; c++) { myMap.count(c) ? cout << "\nNumber of elements '" << c << "' in myMap = " << myMap.count(c) : cout << "\nElement '" << c << "' is not in myMap "; myMultimap.count(c) ? cout << "\nNumber of elements '" << c << "' in myMultimap " << myMultimap.count(c) : cout << "\nElement '" << c << "' is not in myMultimap"; } itMap = myMap.find('b');///итератор на заданный элемент в map itMultimap = myMultimap.find('a');///итератор на заданный элемент в multimap myMap.erase(itMap);///стираем его в map myMultimap.erase(itMultimap);///стираем его в multimap itMap = myMap.find('d'); itMultimap = myMultimap.find('d'); myMap.erase(itMap,myMap.end());///стираем c элемента 'd' и до конца map myMultimap.erase(itMultimap,myMultimap.end());///стираем c элемента 'd' и до конца multimap cout << "\n\nmyMap contains: \t myMultimap contains:\n"; for(itMap = myMap.begin(),itMultimap = myMultimap.begin(); itMap != myMap.end(); itMap++,itMultimap++) { cout << itMap->first << " : " << itMap->second << "\t\t\t\t" << itMultimap->first << " : " << itMultimap->second << endl;///вывод на экран } myMap.clear(); myMap.empty() ? cout << "\nmyMap is empty\n" : cout << "myMap isn't empty\n"; myMultimap.empty() ? cout << "\nmyMultimap is empty\n" : cout << "myMultimap isn't empty\n"; return 0; }
Выполнение программы:
myMap contains: myMultimap contains:
a : 0 a : 23
b : 1 a : 56
c : 2 b : 996
d : 3 c : 146
e : 4 c : 121
Number of elements ‘a’ in myMap = 1
Number of elements ‘a’ in myMultimap 2
Number of elements ‘b’ in myMap = 1
Number of elements ‘b’ in myMultimap 1
Number of elements ‘c’ in myMap = 1
Number of elements ‘c’ in myMultimap 2
Number of elements ‘d’ in myMap = 1
Element ‘d’ is not in myMultimap
Number of elements ‘e’ in myMap = 1
Element ‘e’ is not in myMultimap
Element ‘f’ is not in myMap
Element ‘f’ is not in myMultimap
myMap contains: myMultimap contains:
a : 0 a : 56
c : 2 b : 996
myMap is empty
myMultimap isn’t empty
Думаю, до строки 31, код должен быть понятен, если нет, то в двух словах происходит следующее: мы объявляем контейнер multimap
и map
, заполняем и выводим их. В 33 и 34 строке используется функция map::count()
, которая осуществляет подсчет элементов в контейнерах multimap
и map
по заданному «ключу». Если такой ключ есть то будет выведено количество «ключей» в map
и multimap
иначе, будет выведено сообщение, что таких ключей нет В строках 33 и 34 применяется тернарный оператор, про который можно почитать тут.
Функция map::find()
осуществляет поиск в контейнере заданного «ключа». Функция принимает один аргумент («ключ» который требуется найти в контейнере map
или multimap
). В 37 строке создается итератор itMap
указывающий на «ключ» b
в контейнере map
. В 38 строке создается итератор itMultimap
, указывающий на «ключ» а
,но уже в контейнере multimap
.
В строке 39 встречается функция map::erase()
. Работа этой функции не чем не отличается от работы функции vector::erase()
. Функция может принимать один или два аргумента. При принятии одного аргумента из контейнера map
или multimap
удаляется заданный аргумент, если аргументов двое, то первый аргумент указывает на место откуда начнется удаление, второй по куда будет произведено удаление аргументов. Поскольку итератор itMap
указывает на b
, а itMultimap
указывает на а
, то соответственно в 39 строке из контейнера map
будет удалено b
, а в строке 40 из multimap
удалено а
. В строке 41 мы говорим итератору itMap
, чтобы он указывал на d
в контейнере map
, соответственно в 42 строке итератор itMultimap
начинает указывать тоже на d
, но в контейнере multimap
. В строке 43 мы очищаем контейнер map
начиная с d
и до конца map
. Тоже происходит в строке 44, но уже с контейнером multimap
. В строках 47-49 производится вывод на экран содержимых контейнеров multimap
и map
после удаления из них элементов.
Функция map::clear()
используемая в строке 52 полностью очищает контейнер map
. Функцию map::clear()
поддерживает и контейнер multumap
. Я специально очистил только один контейнер map
, что бы на примере функции map::empty()
(описанной в 53 и 54 строке) показать, что контейнер действительно пуст. Думаю, работа кода в строках 53 и 54 должна быть понятна.
Комментарии
Дмитрий Гловацкий
В данном примере в строке 47 подразумевается, что на экран будет выведено кол-во элементов, равное кол-ву находящихся в объекте класса map = 2, соответственно, с объекта класса multimap также вывели 2 объекта. Остальные 2 элемента (с:146, с:121) просто не вывелись.
Александр Козлов
Доброго времени суток. Кто может мне объяснить строку 44? По ней в контейнере «myMultimap» удаляются все с «d» и до конца контейнера, но в контейнере «myMultimap» ключа «d» нет, а в конечном результате из контейнера «myMultimap» были удалены ключи «c». Если это не опечатка, как все это работает?