Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
небольшим отличием. В этот контейнер можно помещать сразу два значения. Если у Вас
когда-то была мечта написать свой словарь, то лучше чем map, вам альтернативы не найти. И
так, что же такое этот map, давай рассмотрим более подробнее на примере:
#include <iostream>
#include <map> //подключили библиотеку для работы с map
using namespace std;
int main()
{
map <string,int> myFirstMap = {{ "Mother", 37 },
{ "Father", 40 },
{ "Brother", 15 },
{ "Sister", 20 }};
char c;
map <char,int> mySecondMap;
for (int i = 0,c = 'a'; i < 5; ++i,++c)
{
mySecondMap.insert ( pair<char,int>(c,i) );
}
Нужно добавить, что map можно использовать в виде ассоциативного массива. Массива
который позволяет в себе хранить пару вида («ключ», «значение»), а так-же добавлять и
удалять пары по ключу. У нас в роли ключа выступает тип string, а в роли значения тип
int.
int main()
{
map <char,int> myFirstMap;///объявили map
///заполняем myFirstMap
myFirstMap.insert ( pair<char,int>('a',10) );
myFirstMap.insert ( pair<char,int>('a',20) );
myFirstMap.insert ( pair<char,int>('a',10) );
///заполняем myFirstMultimap
myFirstMultimap.insert ( pair<char,int>('a',10) );
myFirstMultimap.insert ( pair<char,int>('a',20) );
myFirstMultimap.insert ( pair<char,int>('a',10) );
///заполняем myMultimap
myMultimap.insert ( pair<char,int>('q',111) );
myMultimap.insert ( pair<char,int>('u',201) );
myMultimap.insert ( pair<char,int>('h',301) );
myMap.clear();
myMultimap.clear();
В 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.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.
#include <iostream>
#include <map>
return 0;
}
Работа программы:
CppStudio.com
myMapExample: myMultimapExample:
Desk : 0.01 0.01 : Desk
Pencil : 0.03 0.01 : Table
Table : 0.02 0.03 : Pencil
myMapExampleDifferent: myMultimapExampleDifferent:
Desk : 0.01 0.01 : Desk
Pencil : 0.03 0.01 : Table
• Вариант №1 — или самый распространенный вариант. В строке 11 и 12 с помощью
функции map:: insert(), мы добавляем элементы в map. Функция принимает два
аргумента, первый аргумент ключ, у нас это тип string, второй это значение, у
нас это тип float. Строки 13 и 14 идентичны строками 11 и 12, но там элементы
добавляются в multimap.
• Вариант №2 — с использованием итератора. В строке 17 создаем
итераторitMultimapExample, в строке 18, итератор itMapExample.
Функцииmap::insert(), в строке 19 мы передаем два аргумента (первым
аргументом выступает наш итератор itMapExample, а вторым, пара
ключ, значение). Строка 20 равносильна строке 19, только там
функция map::insert(), применяется к контейнеру multimap. Может возникнуть
вопрос, чем первый вариант отличается от второго? Ответ, тем, что нашим итератором
мы рекомендуем позицию, с которой следует начинать поиск позиции элемента,
который мы хотим вставить.
• Вариант №3 — с использованием функции map::find(). В строке 23, 24 объявляем еще
один контейнер map и multimap. Строку 25 можно прочитать так: заполняй
контейнер myMapExampleDifferent, начиная с начала myMapExample, пока в
контейнере myMapExample не встретишь ключ Table. Этот ключ не будет вставлен
в myMapExample. Строка 26 выполняет предыдущее действие, но применительно к
multimap контейнеру. Вывод на экран myMapExample и myMultimapExample
осуществляется в строках 30-33, а вывод
myMapExampleDifferent и myMultimapExampleDifferent строках 38-41 .
///заполняем multimap
mymultimap.insert( pair<char,float>('a',0.1) );
mymultimap.insert( pair<char,float>('b',0.2) );
mymultimap.insert( pair<char,float>('d',0.4) );
mymultimap.insert( pair<char,float>('e',0.5) );
///заполняем map
mymap.insert( pair<char,float>('f',5.3) );
mymap.insert( pair<char,float>('g',4.32) );
mymap.insert( pair<char,float>('i',23.41) );
mymap.insert( pair<char,float>('r',6.5) );
mymultimap.erase(lowerMultimap,upperMultimap);
mymap.erase(lowerMap,upperMap);
auto itMultimap = mymultimap.begin();
auto itMap = mymap.begin();
cout << "\nmymultimap have: \t mymap have:" << endl;
for (itMultimap,itMap; itMultimap != mymultimap.end(); +
+itMultimap,++itMap)
{
cout << itMultimap->first << " : " << itMultimap->second <<
"\t\t " << itMap->first << " : " << itMap->second << endl;
}
return 0;
}
Работа программы:
CppStudio.com
mymultimap have:
a : 0.1
b : 0.2
b : 9.9
c : 0.3
d : 0.4
e : 0.5
mymultimap have: mymap have:
a : 0.1 f : 5.3
e : 0.5 r : 6.5
В строках 11-14 происходит заполнение контейнера multimap, в строках 17-20 происходит
заполнение контейнера map. В строке 23 встречается функция map::emplace(), которая
равносильна функции map::insert, но ей не нужно, явно, каждый раз, указывать тип
переменной. В строках 26-29 осуществляет вывод на экран контейнера multimap.
Контейнер map не поддерживает функцию map::emplace(). В строке 31 мы встречаем
функцию map::lower_bound(). Эта функция принимает только один аргумент и
возвращает первую позицию в которую может быть вставлен этот элемент. С помощью
функции map::lower_bound(), создаем итератор, указывающий на ключ g в контейнере
map. В 32 строке мы встречаем функцию map::upper_bound(), она возвращает
последнюю позицию , в которую может быть вставлен элемент. В строке 32 создаем еще
один итератор, но уже с помощью функции map::upper_bound() и указывающий
на ключ i. В строках 33, 34, выполняется тоже, но с контейнером multimap. Данные
итераторы выступают в роли «границ», где при помощи map::erase() в строке 38, 39,
мы очищаем оба контейнера (границы контейнеров, тоже стираются). Что осталось в
контейнерах, показано в строках 43-46, где осуществляется вывод на экран.
Обмен содержимым контейнеров map и
multimap
Для того, что бы поменять содержимое контейнеров местами, можно использовать
следующий код:
map<char,int> MapFirst,MapSecond,temp;
temp=MapFirst;
MapFirst=MapSecond;
MapSecond=temp;
Но в С++ предусмотрена для этого специальная функция map::swap(), которая позволяет
менять содержимое контейнеров map и multimap местами, сейчас покажу как.
#include <iostream>
#include <map>
MapFirst['a']=1;
MapFirst['b']=2;
MapSecond['z']=23;
MapSecond['y']=22;
swap(MapFirst,MapSecond);///обмен
MapFirst.swap(MapSecond);///обмен
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. В квадратных скобках
мы указываем наш ключ, а после знака равенства — значение.
Object 1