Упорядоченное множество элементов (set)
Хранит упорядоченно набор уникальных элементов. Обертка вокруг бинарного дерева поиска. Очевидно, что поменять элемент в такой коллекции скорее всего нельзя, впрочем, можно удалять и добавлять элементы. Имеется вариация множества без сортировки unsorted_set. Поскольку множества – понятие из математики, то в stl также добавили возможность находить объединение, пересечение и удаление множеств.
template < class T, // set::key_type/value_type
class Compare = less<T>, // set::key_compare/value_compare
class Alloc = allocator<T> // set::allocator_type
> class set;
Как видите, если не указан класс-сравниватель элементов, то элементы упорядочиваются по возрастанию.
Когда используется set?
Set используется, когда требуется хранить громадные коллекции объектов, в которых нужно часто проводить поиск, в которые часто вставляются и удаляются элементы. Если таких требований нет, то используются тип попроще – vector. Если сортировка требуется не всегда, то проще отсортировать вектор (std::sort(vector.begin(), vector.end())).
Пример
#include "stdafx.h"
#include <set>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
using namespace std;
template <typename TData>
void Print(const set<TData>& set, const char* delimiter)
{
cout << "Set content: ";
copy(
set.begin(),
set.end(),
ostream_iterator<TData>(std::cout, delimiter));
cout << endl;
}
void PrintSet(const set<int>& set)
{
// first way.
cout << "Set content: ";
for (auto setIterator = set.begin(); setIterator != set.end(); ++setIterator)
cout << *setIterator << " ";
cout << endl;
// second way.
cout << "Set content: ";
copy(
set.begin(),
set.end(),
ostream_iterator<int>(std::cout, " "));
cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
// unique elements.
int elements[] = { 1, 1, 13 };
set<int> elementsSet(elements, elements + 3); // only unuqie elements were added.
PrintSet(elementsSet);
// search
set<string> namesSet = { "Test", "Abba" };
Print(namesSet, "\n");
if (namesSet.find("Test") != namesSet.end())
cout << "Test is in set\n";
// add, remove elements
namesSet.erase("Test");
namesSet.insert("We need a hero");
Print(namesSet, ", ");
getchar();
return 0;
}
Multiset
То же самое, что и set, только элементы могут повторяться. Редко используется.