Контейнер map (функции at(), clear(), count(), erase(), empty())

При помощи функции 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;
}

Выполнение программы:

CppStudio.com

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;
}

Выполнение программы:

CppStudio.com

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 должна быть понятна.

Автор: Marienko L.
Дата: 28.02.2014
Поделиться:

Комментарии

  1. Дмитрий Гловацкий

    В данном примере в строке 47 подразумевается, что на экран будет выведено кол-во элементов, равное кол-ву находящихся в объекте класса map  = 2, соответственно, с объекта класса multimap также вывели 2 объекта. Остальные 2 элемента (с:146, с:121) просто не вывелись.

  2. Александр Козлов

    Доброго времени суток. Кто может мне объяснить строку 44? По ней в контейнере «myMultimap» удаляются все с «d» и до конца контейнера, но в контейнере «myMultimap» ключа «d» нет, а в конечном результате из контейнера «myMultimap» были удалены ключи «c». Если это не опечатка, как все это работает?

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.