int main ()
{
set setlntegers;
// Вставить произвольные значения
setlntegers.insert (43);
setlntegers.insert (78);
setlntegers.insert (-1);
setlntegers.insert (124);
13:
// Вывод содержимого набора на экран
for (auto iElement = setlntegers.cbegin ()
; iElement != setlntegers.cend ()
; ++ iElement )
cout « *iElement « endl;
19:
// Попытаться найти элемент
auto iElementFound = setlntegers.find (-1);
// Проверить, если найдено...
24: if (iElementFound != setlntegers.end ())
cout « "Element " « *iElementFound « " found!" « endl;
else
cout « "Element not found in set!" « endl;
28:
// Попытаться найти другой элемент
auto iAnotherFind = setlntegers.find (12345);
// Проверить, если найдено...
if (iAnotherFind != setlntegers.end ())
cout « "Element " « ^iAnotherFind « " found!" « endl;
else
15 3ak. 3626
450 ЗАНЯТИЕ 19. Классы наборов библиотеки STL
cout « "Element 12345 not found in set!" « endl;
return 0;
}
Результат
- i
43
78
124
Element -1 found!
Element 12345 not found in set!
Анализ
Строки 21 -27 демонстрирую т применение функции-члена f i n d ( ) . О на возвращает итератор, сравнение которого с результатом функции en d (), как показано в строке 24, п о зволяет проверить, был ли найден элемент. Если итератор допустим, можно обратиться i значению, на которое указывает * iE le m en tF o u n d .
ПРИМЕЧАНИЕ
Пример в листинге 19.3 сработает правильно и для мультимножества, т.е. если
в строке
6 set заменить на multiset, то код продолжит работать правильно.
Удаление элементов в наборе и мультимножестве
Ассоциативные контейнеры, такие как s e t , m u l t i s e t , map и m u ltim a p , предоставля ют функцию -член e r a s e (), позволяющую удалять значение по ключу:
setObject.erase (key);
Другая форма функции e r a s e () позволяет удалить определенный элемент, заданны!
указывающим на него итератором:
setObject.erase (iElement);
Вы можете стереть диапазон элементов набора или мультимножества, используя ите раторы, задающие границы диапазона:
setObject.erase (iLowerBound, iUpperBound);
Пример в листинге 19.4 демонстрирует использование метода e r a s e () для удаленш элементов из набора или мультимножества.
И С ТИ Н Г 1 9 .4 . Использование функции-члена erase () для мультимножества_______________
#include
#include
using namespace std;
3:
template
void DisplayContents (const T& Input)
Простые операции с классами set и multiset библиотеки STL
|
451
|
{
for(auto iElement = Input.cbegin () // auto, cebgin(): C++11
; iElement != Input.cend () // cend(): C++11
; ++ iElement )
cout « *iElement « '
.1 :
cout « endl;
}
14:
typedef multiset MSETINT;
int main ()
{
MSETINT msetIntegers;
2 0 :
// Вставить произвольные значения
msetlntegers.insert (43);
msetlntegers.insert (78);
msetlntegers.insert (78); // Совпадение
msetlntegers.insert (-1);
msetlntegers.insert (124);
27:
28: cout « "multiset contains " « msetlntegers.size ()
" elements.";
cout « " These are: " « endl;
// Вывод содержимого мультимножества на экран
DisplayContents(msetlntegers);
33:
|
cout « "Please enter a number to be erased from the set"
|
34:
|
endl;
int nNumberToErase = 0;
cin » nNumberToErase;
cout « "Erasing " « msetlntegers.count (nNumberToErase);
cout « " instances of value " « nNumberToErase « endl;
// Попытаться найти элемент
msetlntegers.erase (nNumberToErase);
43:
44: cout « "multiset contains " « msetlntegers.size ()
" elements.";
cout « " These are: " « endl;
DisplayContents(msetlntegers);
return 0;
}
Результат
multiset contains 5 elements. These are:
-1 43 78 78 124
Please enter a number to be erased from the set
452 ЗАНЯТИЕ 19. Классы наборов библиотеки STL
78
Erasing 2 instances of value 78
multiset contains 3 elements. These are:
-1 43 124
Анализ
Обратите внимание на использование в строке 15 ключевого слова ty p e d e f . Стро ка 38 демонстрирует применение функции c o u n t О для выяснения количества элементов
определенным значением. Фактическое удаление осуществляется в строке 42, где удаля ются все элементы, которые соответствуют определенному числу.
Обратите внимание на то, что функция e r a s e () имеет несколько перегруженных вер сий. Ее можно вызвать для итератора, возвращенного, скажем, в результате поиска, чтобы удалить один элемент с найденным значением, как показано ниже.
MSETINT::iterator iElementFound = msetlntegers.find (nNumberToErase); if (iElementFound != msetlntegers.end ())
msetlntegers.erase (iElementFound);
else
cout « "Element not found!" « endl;
Точно так же вы можете использовать функцию e r a s e () для удаления из мультимно жества диапазона значений:
MSETINT::iterator iElementFound = msetlntegers.find (nValue);
if (iElementFound != msetlntegers.end ())
msetlntegers.erase (msetlntegers.begin (), iElementFound);
Приведенный выше фрагмент удаляет все элементы от начала до элемента со значени ем nV alue, не включая последнего. И набор, и мультимножество могут быть освобождены от своего содержимого при помощи функции-члена c l e a r ().
Теперь, после краткого обзора базовых функций набора и мультимножества, пришло время рассмотреть пример практического применения этого контейнерного класса. При мер в листинге 19.5 является самой простой реализацией телефонного справочника, по зволяющего пользователю вставлять имена и номера телефонов, находить их, удалять и отображать их все.
Л И СТИ Н Г 1 9 .5 . Телефонный справочник, демонстрирующий
возможности класса set библиотеки STL____________________________________________________
#include
#include
#include
using namespace std;
template ctypename T>
void DisplayContents (const T& Input)
{
for(auto iElement = Input.cbegin () // auto, cebgin(): C++11
Do'stlaringiz bilan baham: |