Множини часто використовують для збереження об’єктів класів користувачів. Але можна зберігати також об’єкти стандартних класів.
В програмі 15.28 продемонстрована множина, яка зберігає об’єкти класу string.
#include<iostream>
#include<set>
#include<string>
#include<conio>
using namespace std;
int main()
{string names[]={"Jane","Mary","Anne","Katy","Ruby"};
set<string,less<string> >nameSet(names,names+5);
set<string,less<string> >::iterator iter;
nameSet.insert("Yvette");
nameSet.insert("Rose");
nameSet.insert("Jane");//вставка елемента
nameSet.erase("Mary"); //видалення елемента
cout<<"\nRozmir="<<nameSet.size()<<endl;
iter=nameSet.begin();
while(iter!=nameSet.end())
cout<<*iter++<<endl;
string searchName;
cout<<"\nVvedit shukane imja: ";
cin>>searchName;
iter=nameSet.find(searchName);
if(iter==nameSet.end())
cout<<"Imja "<<searchName<<" vidsutne";
else
cout<<"Imja "<<*iter<<" najavne ";
cout<<endl;
getch();
return 0;
}
Програма 15.28
Для визначення множини необхідно вказати тип збережених в ній об’єктів. В нашому випадку це об’єкти класу string. До того ж, необхідно вказати функціональний об’єкт, який використовуватиметься для впорядкування елементів множини. тут ми використали less<>, застосовуючи його до рядкових об’єктів.
Як бачимо, множина має інтерфейс, схожий на інші контейнери STL. Ми можемо ініціалізувати множину масивом, вставляти дані методом insert(), виводити їх за допомогою ітераторів.
Для знаходження елементів ми використали метод find() (Послідовні контейнери мають однойменний алгоритм).
Основною перевагою асоціативних контейнерів порівняно з послідовними є швидкість пошуку.
Розглянемо досит важливу пару методів, які можна використовувати лише з асоціативними контейнерами: lower_bound та upper_bound().
//тестування роботи з діапазонами в множинах
#include<iostream>
#include<conio>
#include<set>
#include<string>
using namespace std;
int main()
{set<string, less<string> > organic;
set<string, less<string> >::iterator iter;
organic.insert("Curine");
organic.insert("Curarine");
organic.insert("Melanin");
organic.insert("Pherol");
organic.insert("Cianimid");
organic.insert("Aphrodine");
iter=organic.begin(); //виведення множини
while(iter!=organic.end())
cout<<*iter++<<'\n';
string lower,upper;//виведення значень з діапазону
cout<<"\nVvedit diapazon napr. A Z";
cin>>lower>>upper;
iter=organic.lower_bound(lower);
while(iter!=organic.upper_bound(upper))
cout<<*iter++<<'\n';
getch();
return 0;
}
Програма 15.29
Метод lower_bound() бере в якості аргументу значення того ж типу, що й ключ. Він повертає ітератор, що вазує на перший запис множинип, значення якого не менше за аргумент (що означає «не менше» в кожному конкретному випадку використовується конкретним функціональним об’єктом, що використовується при визначенні множини). Функція upper_bound() повертає ітератор, що вказує на елемент, значення якого більше, ніж аргумент. Обидві ці функції дозволяють задавати діапазон значинь в контейнері.