Обмен содержимым контейнеров map и multimap

Для того, что бы поменять содержимое контейнеров местами, можно использовать следующий код:

map<char,int> MapFirst,MapSecond,temp;

temp=MapFirst;
MapFirst=MapSecond;
MapSecond=temp;

Но в С++ предусмотрена для этого специальная функция map::swap(), которая позволяет менять содержимое контейнеров map и multimap местами, сейчас покажу как.

#include <iostream>
#include <map>

using namespace std;
int main ()
{
  map<char,int> MapFirst;
  map<char,int> MapSecond;

  MapFirst['a']=1;
  MapFirst['b']=2;

  MapSecond['z']=23;
  MapSecond['y']=22;

  cout << "MapFirst keeps before swap:  MapSecond keeps before swap:" << endl;
  auto itMapFirst=MapFirst.begin();
  auto itMapSecond=MapSecond.begin();
  for(itMapFirst,itMapSecond; itMapFirst != MapFirst.end(); ++itMapFirst,++itMapSecond)
  {
      cout << itMapFirst->first << " : " << itMapFirst->second << "\t\t\t\t\t"
      << itMapSecond->first << " : " << itMapSecond->second <<endl;
  }

  swap(MapFirst,MapSecond);///обмен 

  cout << "MapFirst keeps after swap:    MapSecond keeps after swap:" << endl;
  itMapFirst=MapFirst.begin();
  itMapSecond=MapSecond.begin();
  for(itMapFirst,itMapSecond; itMapFirst != MapFirst.end(); ++itMapFirst,++itMapSecond)
  {
      cout << itMapFirst->first << " : " << itMapFirst->second << "\t\t\t\t\t"
      << itMapSecond->first << " : " << itMapSecond->second <<endl;
  }

  MapFirst.swap(MapSecond);///обмен

  cout << "MapFirst keeps after anoter swap:    MapSecond keeps after anoter swap:" << endl;
  itMapFirst=MapFirst.begin();
  itMapSecond=MapSecond.begin();
  for(itMapFirst,itMapSecond; itMapFirst != MapFirst.end(); ++itMapFirst,++itMapSecond)
  {
      cout << itMapFirst->first << " : " << itMapFirst->second << "\t\t\t\t\t"
      << itMapSecond->first << " : " << itMapSecond->second <<endl;
  }

  return 0;
}

Вывод программы:

CppStudio.com

MapFirst keeps before swap: MapSecond keeps before swap:
a : 1                                  y : 22
b : 2                                  z : 23
MapFirst keeps after swap: MapSecond keeps after swap:
y : 22                                 a : 1
z : 23                                 b : 2
MapFirst keeps after anoter swap: MapSecond keeps after anoter swap:
a : 1                                  y : 22
b : 2                                  z : 23

В строках 10, 11 мы заполняем контейнер MapFirst, в строках 13,14 контейнер MapSecond.

Обратите внимание на еще один вариант заполнения контейнера map. В квадратных скобках мы указываем наш ключ, а после знака равенства — значение.

В строках 19-23, выводим на экран содержимое наших контейнеров. В строке 25 происходит смена элементов двух контейнеров. Теперь контейнер MapFirst содержит то, что содержал контейнер MapSecond, а MapSecond содержит значения контейнера MapFirst.

Важно: функция map::swap() работает только в случае, если контейнеры относятся к одному типу т. е., если вы напишите, что-то вроде этого:

map<char,int> MapFirst;
map<char,float> MapSecond;

компилятор выдаст ошибку. Будьте внимательны, не допускайте подобного.

В строках 30-34 осуществляется вывод на экран. Альтернативный вариант функции map::swap() показан в строке 36 и вывод в строках 41-45 показывающий, что функция отработала верно. Для контейнера multimap все работает так же, как и для контейнера map.

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

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

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