Упорядоченное множество элементов (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, только элементы могут повторяться. Редко используется.

Наши рекомендации