В STL есть замечательный контейнер — set, он реализует такие сущности как множество и мультимножество. По сути это контейнеры, которые содержат некоторое количество отсортированных элементов. Да, именно так, при добавлении нового элемента в множество он сразу становится на свое место так, чтобы не нарушать порядка сортировки. Потому как в множестве и мультимножестве все элементы сортируются автоматически. Но вот вопрос, в чем же разница между множествами и мультимножествами? Множества содержат только уникальные элементы, а мультимножества могут содержать дубликаты, вот такая вот небольшая разница.
Для того, чтобы использовать множество или мультимножество необходимо подключить следующий заголовочный файл:
#include <set>
Давайте рассмотрим простой пример использования множества в программе:
#include <iostream>
#include <set> // заголовочный файл множеств и мультимножеств
#include <iterator>
using namespace std;
int main()
{
set<char> mySet; // объявили пустое множество
// добавляем элементы в множество
mySet.insert('I');
mySet.insert('n');
mySet.insert('f');
mySet.insert('i');
mySet.insert('n');
mySet.insert('i');
mySet.insert('t');
mySet.insert('y');
copy( mySet.begin(), mySet.end(), ostream_iterator<char>(cout, " "));
return 0;
}
Чтобы объявить множество, необходимо подключить заголовочный файл set, это сделано в строке 2. Для объявления множества необходимо воспользоваться классом set, строка 8. То есть в восьмой строке, мы создали объект — множество с именем mySet, элементы которого имеют тип данных char. Строки 11-18 добавляют в множество новые элементы, до этого, множество было пустое. Чтобы добавить элемент в множество, достаточно воспользоваться методом insert(), которому в параметре передать новый элемент. Ну и в строке 20 как обычно выполняется вывод множества на экран, с помощью функции copy(). Смотрим результат работы программы:
I f i n t y
А теперь давайте по порядку будем разбираться, почему же у нас получился такой вывод программы. Во-первых, обратите внимание на порядок добавления элементов в коде, строки 11-18, и на реальный порядок расположения этих элементов в множестве. Порядок ввода и реальный порядок элементов в множестве — разный, это связано с тем, что элементы множества автоматически сортируются. Еще одной очень важной деталью является то, что в множество не сохранились дубликаты, хотя дубликаты были при добавлении элементов в множество. Как видно в выводе программы, каждый элемент множества уникален.
Сра зу же хочу обратить ваше внимание на то, что это программа была простым примером использования МНОЖЕСТВА. Давайте немного переделаем эту программу:
multiset<char> mySet; // объявили пустое множество
Я изменил всего одну строку, чтобы показать пример с мультимножеством. Как вы уже могли догадаться, достаточно было вместо класса set воспользоваться классом multiset — класс мультимножества. Весь остальной код не меняем и смотрим на результат работы программы:
I f i i n n t y
Результат другой, так как мультимножество может хранить дубликаты элементов, все введенный буквы — сохранились. Ну и конечно все элементы отсортировались, как и в множестве. Из всего этого стоит запомнить то, что порядок ввода элементов в множество никак не влияет на порядок хранения в множестве. А также, мультимножество умеет хранить дубликаты, в отличие от множества. Если вам нужно объявить множество ,используйте класс set, если же вы хотите объявить мультимножество — воспользуйтесь классом multiset.
Автоматическая сортировка элементов в множествах накладывает определенные ограничения. Например, в множествах нельзя изменить значение какого-то элемента напрямую, так как это могло бы сломать сортировку. Поэтому, если вам сильно нужно это сделать, вы сначала должны удалить старый элемент, а потом добавить новый. Рассмотрим пример программы с удалением и добавлением нового элемента:
#include <iostream>
#include <set> // заголовочный файл множест и мультимножеств
#include <iterator>
#include <cstdlib>
using namespace std;
int main()
{
srand(time(NULL));
set<int> mySet; // объявили пустое множество
// добавляем элементы в множество
for( int i = 0; i < 10; i++) {
mySet.insert( rand() % 100 );
}
cout << "Элементы множества: ";
copy( mySet.begin(), mySet.end(), ostream_iterator<int>(cout, " "));
int del = 0;
cout << "\nКакой элемент удалить? ";
cin >> del;
cout <<"Элемент " << *mySet.find(del) << " - удален!" << endl;
mySet.erase(del);
int add = 0;
cout << "Какой элемент добавить? ";
cin >> add;
cout << "Новый элемент добавлен на место старого - " << *mySet.lower_bound(add) << endl;
mySet.insert(add);
cout << "Мы удалили элемент " << del << " и добавили " << add << ".\nВот что получилось: " << endl;
copy( mySet.begin(), mySet.end(), ostream_iterator<int>(cout, " "));
return 0;
}
В этом примере мы сначала удаляем элемент множества, это делается в строке 26, с помощью метода erase(). Потом мы добавляем новый элемент, строка 33. Кроме этого, обратите внимание на метод — find(), строка 25, он возвращает указатель на первый элемент множества, который равен его аргументу. Еще один интересный метод, которым мы воспользовались в программе называется — lower_bound(), строка 32. Метод lower_bound() возвращает указатель на первый элемент множества, значение которого больше либо равно аргументу. Вот вывод программы:
Элементы множества: 29 31 40 46 47 71 74 80 87 92 Какой элемент удалить? 47 Элемент 47 - удален! Какой элемент добавить? -3 Новый элемент добавлен на место старого - 29 Мы удалили элемент 47 и добавили -3. Вот что получилось: -3 29 31 40 46 71 74 80 87 92
Все эти операции, в программах выше, характерны и для мультимножеств, поэтому отдельные примеры для мультимножеств не вижу смысла показывать. На этом пока все, это была вводная статья по множествам, надеюсь все было понятно.
Комментарии
Johnwood
???
wElenaFax
Работа в интернете
npavelFax
Официальная работа через интернет с обучением.
npavelFax
Официальная работа на дому
npavelFax
Заработок через интернет официальная работа.