cout
|
«
|
"Key " « iPairFound->first
|
«
|
" points
|
to Value:
|
";
|
cout
|
«
|
iPairFound->second « endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
else
|
«
|
"Sorry, pair with key " «
|
Key
|
« " not
|
in map" «
|
endl;
|
cout
|
СОВЕТ
|
|
Если вы используете компилятор, совместимый со стандартом C++11, при объ
|
|
|
явлении итератора очень удобно использовать ключевое слово auto:
|
auto iPairFound = mapIntToString.find(Key);
Компилятор определяет тип итератора автоматически, выводя его из заявлен ного возвращаемого значения функции map::find().
Пример в листинге 20.3 демонстрирует применение функции m u ltim a p : : f i n d ().
ЛИСТИНГ 20.3. Использование функции-члена find ()
для поиска в карте пары “ключ-значение”_______
#include
#include
#include
using namespace std;
template ctypename T>
void DisplayContents (const T& Input)
{
for(auto iElement = Input.cbegin () // auto and cbegin(): C++11
9: ; iElement != Input.cend() // cend(): C++11
; ++ iElement )
11: cout « iElement->first « " -> " « iElement->second
endl;
1 2 :
cout « endl;
}
15:
int main()
{
map mapIntToString;
mapIntToString.insert(make_pair(3, "Three"));
mapIntToString.insert(make_pair(45, "Forty Five"));
mapIntToString.insert(make_pair(-1, "Minus One"));
mapIntToString.insert(make_pair(1000, "Thousand"));
24
25cout « "The multimap contains " « mapIntToString.size();
Простые операции с классами std::map и std::multimap библиотеки STL
|
469
|
cout « " key-value pairs. They are: " « endl;
// Вьшод содержимого карты на экран
DisplayContents(mapIntToString);
30:
cout « "Enter the key you wish tofind: ";
int Key = 0;
cin » Key;
34:
auto iPairFound = mapIntToString.find(Key) ;
if (iPairFound !=mapIntToString.end())
{
cout « "Key " « iPairFound->first « " points to Value: ";
cout « iPairFound->second « endl;
}
else
42: cout « "Sorry, pair with key " « Key « " not in map"
endl;
43:
return 0;
}
Результат
The multimap contains 4 key-value pairs. They are:
-1 -> Minus One
3 -> Three
45 -> Forty Five
1000 -> Thousand
Enter the key you wish to find: 45
Key 45 points to Value: Forty Five
Следующий запуск (где функция find() не находит соответствующего значения):
The multimap contains 4 key-value pairs. They are:
-1 -> Minus One
3 -> Three
45 -> Forty Five
1000 -> Thousand
Enter the key you wish to find: 2011
Sorry, pair with key 2011 not in map
Анализ
Строки 20-23 функции m ain () заполняют карту примерами пар, каждая из которых со относит целочисленный ключ со строковым значением. Когда пользователь вводит ключ, функция f i n d () в строке 35 выполняет его поиск в карте. Функция m ap: : f i n d () всегда возвращ ает итератор, который всегда имеет смысл проверять, сравнивая с итератором, возвращаемым методом e n d (), как показано в строке 36. Если итератор действительно допустим, для доступа к значению используется член класса s e c o n d (строка 39). При втором запуске вы вводите ключ 2011, которого нет в карте, и пользователю отображается сообщение об ошибке.
470 ЗАНЯТИЕ 20. Классы карт библиотеки STL
ВНИМАНИЕ! Никогда не используйте результат функции fin d () непосредственно, не про
верив возвращенный итератор.
Поиск элементов в мультикарте STL
Если бы в листинге 20.3 использовалась мультикарта, появилась бы возможность хра нить в контейнере несколько пар с одинаковым ключом и необходимость поиска в значе ниях, ключи которых совпадают. Следовательно, в случае мультимножества вы использо вали бы метод m u l t i s e t : : c o u n t () для поиска количества значений, соответствующих ключу, а приращение итератора позволило бы получить доступ к следующим значениям:
auto iPairFound = mmapIntToString.find(Key);
// Проверка успеха поиска
if(iPairFound != mmapIntToString.end())
{
Найти количество пар с тем же предоставленным ключом size_t nNumPairsInMap = mmapIntToString.count(1000);
for( size_t nValuesCounter = 0
nValuesCounter < nNumPairsInMap // оставаться в границах
++ nValuesCounter )
{
cout
|
«
|
"Key: " «
|
iPairFound->first;
|
//
|
ключ
|
cout
|
«
|
", Value
|
[" « nValuesCounter
|
«
|
"]=";
|
cout
|
«
|
iPairFound->second « endl;
|
//
|
значение
|
++ iPairFound;
}
else
cout « "Element not found in the multimap";
Стирание элементов из карты или мультикарты STL
Карта и мультикарта предоставляют функцию -член e r a s e (), которая удаляет элемен ты из контейнера. Для удаления всех пар с определенным ключом его следует передать функции e r a s e () как параметр:
mapObject.erase (key);
Другая форма функции e r a s e () позволяет удалить определенный элемент по указы вающему на него итератору:
mapObject.erase (iElement);
Вы можете удалить диапазон элементов из карты или мультикарты, используя итерато ры, обозначающие их границы:
mapObject.erase (iLowerBound, iUpperBound);
В листинге 20.4 показано применение функции e r a s e ().
Простые операции с классами std::map и std::multimap библиотеки STL
|
471
|
ЛИСТИНГ 20.4. Удаление элементов из мультикарты_______________________
#include
#include
#include
using namespace std;
template
void DisplayContents(const T& Input)
{
for(auto iElement = Input.cbegin () // auto и cbegin(): C++11
9: ; iElement != Input.cend() // cend(): C++11
; ++ iElement )
cout« iElement->first« " -> " « iElement->second« endl;
1 2 :
cout« endl;
}
15:
int main()
{
multimapcint, string> mmapIntToString;
// Вставка пар "ключ-значение" в мультикарту
mmapIntToString.insert(make_pair(3, "Three"));
mmapIntToString.insert(make_pair(45, "Forty Five"));
mmapIntToString.insert(make_pair(-1, "Minus One"));
mmapIntToString.insert(make_pair(1000, "Thousand"));
// Вставка дубликатов в мультикарту
mmapIntToString.insert(make_pair(-1, "Minus One"));
mmapIntToString.insert(make_pair(1000, "Thousand"));
cout« "The multimap contains " « mmapIntToString.size ();
cout« " key-value pairs. " « "They are: " « endl;
DisplayContents(mmapIntToString);
33:
// Удаление элемента с ключом -1 из мультикарты
auto NumPairsErased = mmapIntToString.erase(-1);
36: cout« "Erased " « NumPairsErased « " pairs with -1 as key."
endl;
37:
// Удаление из мультикарты элемента по данному итератору
auto iPairLocator = mmapIntToString.find(45);
if(iPairLocator != mmapIntToString.end())
{
mmapIntToString.erase(iPairLocator);
cout« "Erased a pair with 45 as key using an iterator"
endl;
}
45:
// Удаление из мультикарты диапазона...
Do'stlaringiz bilan baham: |