Поскольку, Вы уже сталкивались с функцией map::insert(), в следующем примере, я покажу, альтернативные варианты добавления элементов в контейнер multimap и map, например:
#include <iostream>
#include <map>
using namespace std;
int main ()
{
multimap<float,string> myMultimapExample;
map<string,float> myMapExample;
/// первый вариант
myMapExample.insert ( pair<string,float>("Desk",0.01) );
myMapExample.insert ( pair<string,float>("Table",0.02) );
myMultimapExample.insert ( pair<float,string>(0.01,"Desk") );
myMultimapExample.insert ( pair<float,string>(0.01,"Table") );
/// второй вариант
multimap<float,string>::iterator itMultimapExample = myMultimapExample.begin();///итератор указывает на начало multimap
map<string,float>::iterator itMapExample = myMapExample.begin();
myMapExample.insert ( itMapExample, pair<string,float>("Pencil",0.03) );
myMultimapExample.insert ( itMultimapExample, pair<float,string>(0.03,"Pencil") );
/// третий вариант
map<string,float> myMapExampleDifferent;
multimap<float,string> myMultimapExampleDifferent;
myMapExampleDifferent.insert( myMapExample.begin(),myMapExample.find("Table") );
myMultimapExampleDifferent.insert( myMultimapExample.begin(),myMultimapExample.find(0.03) );
/// вывод на экран map и multimap:
cout << "myMapExample: \t\t myMultimapExample:\n";
for ( itMapExample = myMapExample.begin(),itMultimapExample = myMultimapExample.begin(); itMapExample != myMapExample.end(); ++itMapExample,++itMultimapExample)
{
cout << itMapExample->first << " : " << itMapExample->second << "\t\t " << itMultimapExample->first << " : " << itMultimapExample->second << endl;
}
auto itMapExampleDif = myMapExampleDifferent.begin();
auto itMultimapExampleDif = myMultimapExampleDifferent.begin();
cout << "\nmyMapExampleDifferent: \t myMultimapExampleDifferent:\n";
for ( itMapExampleDif,itMultimapExampleDif; itMapExampleDif != myMapExampleDifferent.end(); ++itMapExampleDif,++itMultimapExampleDif)
{
cout << itMapExampleDif->first << " : " << itMapExampleDif->second << "\t\t " << itMultimapExampleDif->first << " : " << itMultimapExampleDif->second << '\n';
}
return 0;
}
Работа программы:
Если Вы используете MVS 2013 или MVS 2012, то не исключено возникновение вот такой ошибки:
Error C2679: бинарный «<<«: не найден оператор, принимающий правый операнд типа «const std::string» (или приемлемое преобразование отсутствует)
В программе показано три варианта заполнения контейнера multimap и map.
- Вариант №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 кроме функции map::insert(), поддерживает еще функцию map::emplace(), рассмотрим пример:
#include <iostream>
#include <map>
using namespace std;
int main ()
{
multimap<char,float> mymultimap;
map<char,float> mymap;
///заполняем 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) );
///вставляем элементы в multimap
mymultimap.emplace('c',0.3);
mymultimap.emplace('b',9.9);
cout << "mymultimap have:" << endl;
for (auto it = mymultimap.begin(); it != mymultimap.end(); ++it)
{
cout << it->first << " : " << it->second << endl;
}
auto lowerMap=mymap.lower_bound('g');/// нижняя граница map
auto upperMap=mymap.upper_bound('i');///верхняя граница map
auto lowerMultimap=mymultimap.lower_bound('b');/// нижняя граница multimap
auto upperMultimap=mymultimap.upper_bound('d');///верхняя граница multimap
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;
}
Работа программы:
В строках 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, где осуществляется вывод на экран.
Комментарии
mpavelFax
Официальная работа в интернете
Uvelir
Круто