C++ — std::set — std::set-это ассоциативный контейнер,который содержит отсортированный набор уникальных объектов
Определено в заголовке <set> | ||
|---|---|---|
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class set; | (1) | |
namespace pmr {
template <class Key, class Compare = std::less<Key>>
using set = std::set<Key, Compare, std::pmr::polymorphic_allocator<Key>>;
} | (2) | (since C++17) |
std::set является ассоциативным контейнером, который содержит отсортированный набор уникальных объектов типа Key . Сортировка выполняется с помощью функции сравнения ключей Compare . Операции поиска, удаления и вставки имеют логарифмическую сложность. Наборы обычно реализуются как красно-черные деревья .
Везде, где стандартная библиотека использует требования сравнения , уникальность определяется с помощью отношения эквивалентности.
a и b считаются эквивалентными, если ни один из них не сравнивается меньше, чем другой: !comp(a, b) && !comp(b, a) .std::set соответствует требованиям контейнера , AllocatorAwareContainer , AssociativeContainer и ReversibleContainer .
Member types
| Member type | Definition | ||||
|---|---|---|---|---|---|
key_type | Key | ||||
value_type | Key | ||||
size_type | Целочисленный тип без знака (обычно std::size_t ) | ||||
difference_type | Целочисленный тип со std::ptrdiff_t (обычно std :: ptrdiff_t ) | ||||
key_compare | Compare | ||||
value_compare | Compare | ||||
allocator_type | Allocator | ||||
reference | value_type& | ||||
const_reference | const value_type& | ||||
pointer |
| ||||
const_pointer |
| ||||
iterator | Константа LegacyBidirectionalIterator для value_type | ||||
const_iterator | LegacyBidirectionalIterator в const value_type | ||||
reverse_iterator | std::reverse_iterator<iterator> | ||||
const_reverse_iterator | std::reverse_iterator<const_iterator> | ||||
node_type(since C++17) | специализация дескриптора узла, представляющего узел контейнера | ||||
insert_return_type(since C++17) | тип, описывающий результат вставки node_type , специализация
|
Member functions
(constructor) | конструирует set (функция публичного члена) |
| (destructor) | разрушает set (функция публичного члена) |
operator= | присваивает значения контейнеру (функция публичного члена) |
get_allocator | возвращает соответствующий аллокатор (функция публичного члена) |
Iterators | |
begin cbegin (C++11) | возвращает итератор к началу (функция публичного члена) |
концевой поворот (C++11) | возвращает итератор на конец (функция публичного члена) |
rbegincrbegin (C++11) | возвращает обратный итератор к началу (функция публичного члена) |
rendcrend (C++11) | возвращает обратный итератор в конец (функция публичного члена) |
Capacity | |
empty | проверяет,пустой ли контейнер (функция публичного члена) |
size | возвращает количество элементов (функция публичного члена) |
max_size | возвращает максимально возможное количество элементов (функция публичного члена) |
Modifiers | |
clear | очищает содержимое (функция публичного члена) |
insert | вставляет элементы или узлы (начиная с C++17) (функция публичного члена) |
emplace (C++11) | встроенный элемент конструкции (функция публичного члена) |
emplace_hint (C++11) | строит элементы на месте,используя подсказку (функция публичного члена) |
erase | erases elements (функция публичного члена) |
swap | обмениваются содержимым (функция публичного члена) |
extract (C++17) | извлечение узлов из контейнера (функция публичного члена) |
merge (C++17) | узлы сращивания из другого контейнера (функция публичного члена) |
Lookup | |
count | возвращает количество элементов,соответствующих определённому ключу (функция публичного члена) |
find | находит элемент с определенным ключом (функция публичного члена) |
contains (C++20) | проверяет,содержит ли контейнер элемент с определенным ключом (функция публичного члена) |
equal_range | диапазон возвратов элементов,соответствующих определённому ключу (функция публичного члена) |
lower_bound | возвращает итератор к первому элементуnot lessчем данный ключ (функция публичного члена) |
upper_bound | возвращает итератор к первому элементу (функция публичного члена) |
Observers | |
key_comp | возвращает функцию сравнения клавиш (функция публичного члена) |
value_comp | возвращает функцию,которая сравнивает ключи в объектах типа value_type (функция публичного члена) |
Non-member functions
operator==operator!=operator<operator<=operator>operator>=operator<=> (удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) | лексикографически сравнивает значения в комплекте (function template) |
std::swap(std::set) | специализируется на алгоритме std::swap(function template) |
erase_if(std::set) (C++20) | Стирает все элементы,удовлетворяющие определенным критериям (function template) |
© cppreference.
comЛицензия Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/set
Библиотека C ++ — — CoderLessons.com
Набор – это ассоциативный контейнер, который содержит отсортированный набор уникальных объектов типа Key. Каждый элемент может встречаться только один раз, поэтому дублирование не допускается.
Существует четыре вида ассоциативных контейнеров: set, multiset, map и multimap.
Значение элементов в наборе нельзя изменить один раз в контейнере, т. Е. Элементы всегда являются постоянными. Но они могут быть вставлены или удалены из контейнера.
Контейнеры set обычно медленнее, чем контейнеры unordered_set, обращаются к отдельным элементам по их ключу, но они допускают прямую итерацию для подмножеств в зависимости от их порядка.
Определение
Ниже приведено определение std :: set из заголовочного файла <set>
template <
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class set;
параметры
Ключ – тип элемента, который содержится.

Ключ может быть заменен любым другим типом данных, включая определенный пользователем тип.
Ключ – тип элемента, который содержится.
Ключ может быть заменен любым другим типом данных, включая определенный пользователем тип.
Типы участников
Следующие типы элементов могут использоваться в качестве параметров или типа возврата функциями-членами.
| Sr.No. | Типы участников | Определение |
|---|---|---|
| 1 | key_type | ключ |
| 2 | тип ценности | ключ |
| 3 | ссылка | Распределитель :: ссылки тип ценности& |
| 4 | const_reference | Распределитель :: const_reference const value_type & |
| 5 | указатель | Распределитель :: указатель СТД :: allocator_traits <Allocator> :: указатель |
| 6 | const_pointer | Распределитель :: const_pointer станд :: allocator_traits <Allocator> :: const_pointer |
| 7 | итератор | BidirectionalIterator |
| 8 | const_iterator | константа двунаправленного интерфейса |
| 9 | reverse_iterator | std :: reverse_iterator <итератор> |
| 10 | const_reverse_iterator | std :: reverse_iterator <const_iterator> |
| 11 | size_type | Целочисленный тип без знака (std :: size_t) |
| 12 | difference_type | Целочисленный тип со знаком (std :: ptrdiff_t) |
| 13 | key_compare | сравнить |
| 14 | value_compare | сравнить |
| 15 | allocator_type | Распределитель |
тип ценности&
const value_type &
СТД :: allocator_traits <Allocator> :: указатель
станд :: allocator_traits <Allocator> :: const_pointer
Функции из <set>
Ниже приведен список всех методов из заголовка <set>.
ЧЛЕН ФУНКЦИИ
УЧАСТНИКИ ПО УМОЛЧАНИЮ
Создает заданный контейнер.
Создает заданный контейнер с содержимым диапазона.
Строит заданный контейнер с копией другого множества.
Создает контейнер набора с содержимым другого набора, используя семантику перемещения.
Создает контейнер set с содержимым списка инициализаторов.
Уничтожает установленный контейнер.
Назначает значения заданному контейнеру.
Возвращает итератор в начало.
Возвращает константный итератор в начало.
Возвращает итератор до конца.
Возвращает константный итератор до конца.
Возвращает обратный итератор для обратного начала.
Вернуть константный обратный итератор для обратного начала.
Возвращает обратный итератор для обратного конца.
Возвращает const обратный итератор для обратного конца.
Возвращает, если установленный контейнер пуст.
Возвращает количество элементов в заданном контейнере.
Возвращает максимальное количество элементов, которое может содержать установленный контейнер.
Удаляет все элементы из заданного контейнера.
Вставляет новый элемент в заданный контейнер.
Вставляет новый элемент в набор, если он уникален.
Вставляет новый элемент в набор, если он уникален, с подсказкой о позиции вставки.
Удаляет либо отдельный элемент, либо диапазон элементов из заданного контейнера.
Меняет содержимое контейнера на содержимое другого набора контейнера того же типа.
Возвращает количество элементов с совпадающим значением в заданном контейнере.
Выполняет поиск значения в указанном контейнере и возвращает итератор, если он найден, иначе возвращает итератор для set :: end.
Возвращает итератор, указывающий на первый элемент в контейнере набора, который не считается перед значением.
Возвращает итератор, указывающий на первый элемент в контейнере набора, который считается после значения.
Возвращает границы диапазона, который включает все элементы в контейнере набора, которые эквивалентны значению.
Возвращает копию объекта сравнения, используемого контейнером набора.
Возвращает копию объекта сравнения, используемого контейнером набора.
Возвращает копию объекта распределителя, связанного с заданным контейнером.
Всероссийский учебный фестиваль по искусственному интеллекту и программированию RuCode 6.0
О фестивале
Всероссийский учебный фестиваль по искусственному интеллекту и программированию RuCode проходит дважды в год. Предыдущие пять фестивалей собрали в общей сложности более 60 тысяч участников. Его организаторами, наряду с МФТИ, выступают ведущие вузы России, общественные организации, технопарки и кванториумы. Индустриальными партнерами RuCode являются компании «Яндекс» и «Сбер». Фестиваль проходит при поддержке Министерства науки и высшего образования Российской Федерации. В программе фестиваля онлайн-курсы и интенсивы, а также чемпионат по алгоритмическому программированию и искусственному интеллекту.
Онлайн-курсы
Отборы на интенсивы
Программирование
10-13ноября
5-часовой контест
Искусственный интеллект
20-23октября
7 задач по математике
3 задачи по программированию
3 задачи по машинному обучению
2 задачи на анализ данных
Интенсивы
Программирование 21-25ноября Ежедневные обучающие интенсивы (лекция+контест+разбор) с преподавателями ведущих вузов России
Искусственный интеллект 27-23окт-ноя Онлайн-лекции от специалистов и преподавателей в области искусственного интеллекта, решение прикладных задач с помощью технологий искусственного интеллекта
Чемпионат RuCode
Программирование
27ноября
Открытый 5-часовой онлайн-контест.
Участвовать может любой желающий!
Искусственный интеллект 26ноября Презентация лучших решений участников интенсивов по искусственному интеллекту
Вопросы
Могу ли я выбирать этапы фестиваля, в которых буду участвовать?
Все зависит от направления, в котором ты хочешь участвовать 👇
Если речь о программировании, то в чемпионате может участвовать кто-угодно, а, чтобы участвовать в интенсивах, нужно пройти отбор. А если речь об искусственном интеллекте, то тут необходимо пройти отбор для участия в любом из направлений, даже чемпионате. То же касается и 1С.
А онлайн-курсы доступны круглый год в любом из направлений 😉
Могу ли участвовать в нескольких направлениях?
Конечно! Учиться можно в любом из направлений, соревноваться тоже.
❗ Только имей в виду, что даты этапов фестиваля могут пересекаться и какие-то ивенты могут проходить в одно и то же время.
Обязательно ли мне создавать команду?
Все зависит от этапа:
👩💻 Для интенсивов создавать команду не нужно: все участники обучаются единолично и в турнирной таблице показываются соответственно.
🥇 А вот чемпионат — командное состязание. В команде может быть 1, 2 или 3 человека. ❗ Отметим, что регистрировать команду необходимо, даже если ты планируешь участвовать соло — иначе ты просто не получишь логин и пароль от контеста чемпионата.
Как мне принять участие очно?
Информацию о ближайших к тебе очных точках можно посмотреть на страничке направления «алгоритмическое программирование». Там же ты найдешь контакты человека, который тебе подробно расскажет,как, где и когда можно принять участие 🎈
Что такое ДО и ДПО?
🔹ДО — дополнительное образование. С помощью сертификата ДО студенты по согласованию со своим университетом смогут получить строчку «интенсивные алгоритмы» в дипломе.
🔹ДПО — дополнительное профессиональное образование. Это удостоверение установленного образца МФТИ, которое идет как дополнение к диплому. Такое удостоверение могут получить только те участники, у которых есть высшее или среднее профессиональное образование. А студенты могут получить справку о повышении квалификации.
Такую справку они смогут обменять на удостоверение, когда закончат университет 👩🎓👨🎓
Как получить сертификат ДО/ удостоверение ДПО за участие в RuCode?
Сертификаты ДО мы выдаем тем ребятам, которые активно принимали участие в интенсивах, а затем закрепили успех в чемпионате, решив хотя бы одну задачку.
Удостоверение ДПО получить сложнее.
1. Во-первых, данные удостоверения могут получить только люди с высшим и средним профессиональным образованием или студенты.
2. Во-вторых, необходимо приложить несколько документов (скан диплома и паспорта) к регистрационной анкете. Эти данные и документы мы отправляем в Федеральный реестр сведений о документах об образовании и (или) о квалификации.
3. В третьих, необходимо не только активно участвовать в обучении на интенсивах, но и достойно выступить на чемпионате, решив хотя бы 4 задачи.
⭐Таким образом, участник получит удостоверение МФТИ установленного образца о повышении квалификации.
std :: set — cppreference.com
Библиотека контейнеров
Std :: Set
. > набор классов; | (1) | |
| (2) | (начиная с С++ 17) | |
std::set — это ассоциативный контейнер, содержащий отсортированный набор уникальных объектов типа Key . Сортировка осуществляется с помощью функции сравнения ключей Compare. Операции поиска, удаления и вставки имеют логарифмическую сложность. Наборы обычно реализуются в виде красно-черных деревьев.
Везде, где стандартная библиотека использует требования сравнения, уникальность определяется с помощью отношения эквивалентности.
Говоря неточно, два объекта a и b считаются эквивалентными, если ни один из них не сравнивается меньше, чем другой: !comp(a, b) && !comp(b, a) .
std::set соответствует требованиям Container, AllocatorAwareContainer, AssociativeContainer и ReversibleContainer.
|
[править] Типы элементов
| Тип элементов | Определение | ||||
key_type | Ключ [править] | ||||
значение_тип | Ключ [править] | ||||
размер_тип | Беззнаковый целочисленный тип (обычно std::size_t) [править] | ||||
тип_различия | Целочисленный тип со знаком (обычно std::ptrdiff_t) [править] | ||||
key_compare | Сравнить [править] | ||||
сравнение значений | Сравнить [править] | ||||
allocator_type | Распределитель [править] | ||||
каталожный номер | value_type& [править] | ||||
const_reference | const value_type& [править] | ||||
указатель |
| ||||
const_pointer |
| ||||
итератор | Константа LegacyBidirectionalIterator to value_type [править] | ||||
const_iterator | LegacyBidirectionalIterator to const value_type [править] | ||||
реверс_итератор | std::reverse_iterator<итератор> [править] | ||||
const_reverse_iterator | std::reverse_iterator | ||||
node_type (начиная с C++17) | специализация дескриптора узла, представляющая узел-контейнер [править] | ||||
insert_return_type (начиная с C++17) | Тип, описывающий результат вставки node_type , специализации template |
[править] Функции-члены
(конструктор) | создает набор (открытая функция-член) [править] |
(деструктор) | уничтожает набор (открытая функция-член) [править] |
оператор= | присваивает значения контейнеру (открытая функция-член) [править] |
get_allocator | возвращает связанный распределитель (открытая функция-член) [править] |
Итераторы | |
начало с начала (С++ 11) | возвращает итератор в начало (открытая функция-член) [править] |
конец конец (С++ 11) | возвращает итератор в конец (открытая функция-член) [править] |
rbegincrbegin (С++ 11) | возвращает обратный итератор в начало (открытая функция-член) [править] |
rendcrend (С++ 11) | возвращает обратный итератор в конец (открытая функция-член) [править] |
Вместимость | |
| проверяет, пуст ли контейнер (открытая функция-член) [править] | |
| возвращает количество элементов (открытая функция-член) [править] | |
макс_размер | возвращает максимально возможное количество элементов (открытая функция-член) [править] |
Модификаторы | |
| очищает содержимое (открытая функция-член) [править] | |
вставка | вставляет элементы или узлы (начиная с C++17) (открытая функция-член) [править] |
вставить (С++ 11) | создает элемент на месте (открытая функция-член) [править] |
emplace_hint (С++ 11) | создает элементы на месте, используя подсказку (открытая функция-член) [править] |
| стирает элементы (открытая функция-член) [править] | |
| меняет содержимое местами (открытая функция-член) [править] | |
экстракт (С++ 17) | извлекает узлы из контейнера (открытая функция-член) [править] |
слияние (С++ 17) | объединяет узлы из другого контейнера (общедоступная функция-член) [править] |
Поиск | |
| возвращает количество элементов, соответствующих определенному ключу (открытая функция-член) [править] | |
| находит элемент с определенным ключом (открытая функция-член) [править] | |
содержит (C++20) | проверяет, содержит ли контейнер элемент с определенным ключом (открытая функция-член) [править] |
равный_диапазон | возвращает диапазон элементов, соответствующих определенному ключу (открытая функция-член) [править] |
нижняя граница | возвращает итератор к первому элементу не менее , чем заданный ключ (открытая функция-член) [править] |
верхняя граница | возвращает итератор к первому элементу большему , чем заданный ключ (открытая функция-член) [править] |
Наблюдатели | |
key_comp | возвращает функцию, которая сравнивает ключи (открытая функция-член) [править] |
значение_комп | возвращает функцию, которая сравнивает ключи в объектах типа value_type (открытая функция-член) [править] |
[править] Функции, не являющиеся членами
operator==operator!=operator (удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) | лексикографически сравнивает значения в наборе (шаблон функции) [править] |
станд::своп(стд::набор) | специализируется на алгоритме std::swap (шаблон функции) [править] |
erase_if(std::set) (С++ 20) | Стирает все элементы, удовлетворяющие определенным критериям (шаблон функции) [править] |
[править] Руководство по выводу (начиная с C++17)
[править] Примечания
Типы-члены iterator и const_iterator могут быть псевдонимами одного и того же типа.
Это означает, что определение пары перегруженных функций с использованием двух типов в качестве типов параметров может нарушить правило единого определения. Поскольку iterator можно преобразовать в const_iterator , вместо этого будет работать одна функция с const_iterator в качестве типа параметра.
[править] Отчеты о дефектах
Следующие отчеты о дефектах, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| ДР | Применяется к | Поведение после публикации | Правильное поведение |
|---|---|---|---|
| LWG 103 | С++ 98 | Итераторпозволяет изменять ключи | итератор сделан постоянным |
std::unordered_set — cppreference.com
Библиотека контейнеров
Std :: Unoromeded_set
< Class Key. > класс unordered_set; | (1) | (начиная с С++ 11) |
Пространство имен PMR { Шаблон <клавиша класса, } | (2) | (начиная с С++ 17) |
Неупорядоченный набор — это ассоциативный контейнер, содержащий набор уникальных объектов типа Key. Поиск, вставка и удаление имеют среднюю сложность с постоянным временем.
Внутри элементы не сортируются в определенном порядке, а организованы в группы.
В какое ведро помещается элемент, полностью зависит от хеша его значения. Это обеспечивает быстрый доступ к отдельным элементам, поскольку после вычисления хэша он относится к точному сегменту, в который помещен элемент.
Элементы контейнера не могут быть изменены (даже неконстантными итераторами), поскольку модификация может изменить хэш элемента и повредить контейнер.
std::unordered_set соответствует требованиям Container, AllocatorAwareContainer, UnorderedAssociativeContainer.
|
[править] Отключение итератора
| Операции | Недействительный |
|---|---|
| Все операции только для чтения, swap, std::swap | Никогда |
| очистить, перефразировать, зарезервировать, оператор= | Всегда |
| вставить, вставить, вставить_подсказка | Только если вызывает перефразирование |
| стереть | Только к стертому элементу |
[править] Примечания
- Функции подкачки не делают недействительным ни один из итераторов внутри контейнера, но они делают недействительным итератор, обозначающий конец области подкачки.

- Ссылки и указатели на данные, хранящиеся в контейнере, становятся недействительными только при стирании этого элемента, даже если соответствующий итератор становится недействительным.
- После назначения перемещения контейнера, если несовместимые распределители не заставляют поэлементное перемещение перемещать, ссылки, указатели и итераторы (кроме конечного итератора) для перемещения из контейнера остаются действительными, но ссылаются на элементы, которые теперь находятся в *this .
[править] Типы элементов
| Тип элемента | Определение |
key_type | Ключ [править] |
значение_тип | Ключ [править] |
размер_тип | Беззнаковый целочисленный тип (обычно std::size_t) [править] |
тип_различия | Целочисленный тип со знаком (обычно std::ptrdiff_t) [править] |
хэшер | Хэш [править] |
ключ_равный | KeyEqual [править] |
allocator_type | Распределитель [править] |
каталожный номер | value_type& [править] |
const_reference | const value_type& [править] |
указатель | std::allocator_traits<Распределитель>::указатель [править] |
const_pointer | std::allocator_traits<Распределитель>::const_pointer[править] |
итератор | Константа LegacyForwardIterator для value_type [править] |
const_iterator | LegacyForwardIterator to const value_type [править] |
локальный_итератор | Тип итератора, у которого категория, значение, разница, указатель и ссылочные типы такие же, как у итератора . Этот итератор можно использовать для итерации по одному сегменту, но не по сегментам[править] |
const_local_iterator | Тип итератора, у которого категория, значение, разница, указатель и ссылочные типы совпадают с const_iterator . Этот итератор можно использовать для итерации по одному сегменту, но не по сегментам[править] |
node_type (начиная с C++17) | специализация дескриптора узла, представляющая узел-контейнер [править] |
insert_return_type (начиная с C++17) | Тип, описывающий результат вставки node_type , специализация шаблона |
[править] Функции-члены
(конструктор) (С++ 11) | создает unordered_set (открытая функция-член) [править] |
(деструктор) (С++ 11) | уничтожает unordered_set (открытая функция-член) [править] |
оператор = (С++ 11) | присваивает значения контейнеру (открытая функция-член) [править] |
get_allocator (С++ 11) | возвращает связанный распределитель (открытая функция-член) [править] |
Итераторы | |
начало cначало (С++ 11) | возвращает итератор в начало (открытая функция-член) [править] |
конец конец (С++ 11) | возвращает итератор в конец (открытая функция-член) [править] |
Вместимость | |
пусто (С++ 11) | проверяет, пуст ли контейнер (открытая функция-член) [править] |
размер (С++ 11) | возвращает количество элементов (открытая функция-член) [править] |
макс_размер (С++ 11) | возвращает максимально возможное количество элементов (открытая функция-член) [править] |
Модификаторы | |
очистить (С++ 11) | очищает содержимое (открытая функция-член) [править] |
вставка (С++ 11) | вставляет элементы или узлы (начиная с C++17) (открытая функция-член) [править] |
вставить (С++ 11) | создает элемент на месте (открытая функция-член) [править] |
emplace_hint (С++ 11) | создает элементы на месте, используя подсказку (открытая функция-член) [править] |
стереть (С++ 11) | стирает элементы (открытая функция-член) [править] |
подкачка (С++ 11) | меняет содержимое местами (открытая функция-член) [править] |
экстракт (С++ 17) | извлекает узлы из контейнера (открытая функция-член) [править] |
слияние (С++ 17) | объединяет узлы из другого контейнера (общедоступная функция-член) [править] |
Поиск | |
количество (С++ 11) | возвращает количество элементов, соответствующих определенному ключу (открытая функция-член) [править] |
найти (С++ 11) | находит элемент с определенным ключом (открытая функция-член) [править] |
содержит (C++20) | проверяет, содержит ли контейнер элемент с определенным ключом (открытая функция-член) [править] |
равный_диапазон (С++ 11) | возвращает диапазон элементов, соответствующих определенному ключу (открытая функция-член) [править] |
Интерфейс ковша | |
начало (тип_размера) cbegin (тип_размера) (С++ 11) | возвращает итератор в начало указанного сегмента (открытая функция-член) [править] |
end(size_type) cend(size_type) (C++11) | возвращает итератор в конец указанного сегмента (открытая функция-член) [править] |
ведро_счетчик (С++ 11) | возвращает количество сегментов (открытая функция-член) [править] |
max_bucket_count (С++ 11) | возвращает максимальное количество сегментов (открытая функция-член) [править] |
размер_база (С++ 11) | возвращает количество элементов в конкретном сегменте (открытая функция-член) [править] |
ведро (С++ 11) | возвращает корзину для определенного ключа (открытая функция-член) [править] |
Хэш-политика | |
load_factor (С++ 11) | возвращает среднее количество элементов в корзине (открытая функция-член) [править] |
max_load_factor (С++ 11) | управляет максимальным средним количеством элементов в корзине (открытая функция-член) [править] |
перефразировать (С++ 11) | резервирует как минимум указанное количество сегментов и регенерирует хеш-таблицу (открытая функция-член) [править] |
резерв (С++ 11) | резервирует место как минимум для указанного количества элементов и регенерирует хэш-таблицу (открытая функция-член) [править] |
Наблюдатели | |
хеш_функция (С++ 11) | возвращает функцию, используемую для хеширования ключей (открытая функция-член) [править] |
key_eq (С++ 11) | возвращает функцию, используемую для сравнения ключей на равенство (открытая функция-член) [править] |
[править] Функции, не являющиеся членами
оператор == оператор! = (удалено в С++ 20) | сравнивает значения в unordered_set (шаблон функции) [править] |
std::swap(std::unordered_set) (С++ 11) | специализируется на алгоритме std::swap (шаблон функции) [править] |
erase_if(std::unordered_set) (С++ 20) | Удаляет все элементы, удовлетворяющие определенным критериям (шаблон функции) [править] |
[править] Руководство по выводу (начиная с C++17)
[править] Примечания
Типы-члены iterator и const_iterator могут быть псевдонимами одного и того же типа.
Это означает, что определение пары перегруженных функций с использованием двух типов в качестве типов параметров может нарушить правило единого определения. Поскольку iterator можно преобразовать в const_iterator , вместо этого будет работать одна функция с const_iterator в качестве типа параметра.
Обзор контейнеров C++ STL
2 августа 2017 г., Phillip Johnston • Последнее обновление 15 декабря 2021 г.
Ранее мы рассматривали контейнеры C++ array и vector и понимали, почему эти контейнеры лучше стандартных C массивы стилей. Мы также узнали, что контейнеры могут использовать преимущества таких идиом, как шаблон проектирования SBRM и основанные на диапазоне циклы для .
Теперь, когда мы подробно рассмотрели два контейнера (а также псевдоконтейнер std::string , я хотел бы предоставить обзор оставшихся контейнеров C++.
Содержание:
- Стандартные контейнеры
- Контейнеры для последовательностей
- Адаптеры для контейнеров
- Ассоциативные контейнеры
- Неупорядоченные ассоциативные контейнеры
- Причины использования стандартных контейнеров
- Стандартный контейнер с защитой от резьбы
- Дополнительное чтение
Стандартные контейнеры
Библиотека контейнеров представляет собой набор шаблонов и алгоритмов, которые реализуют общие структуры данных, с которыми мы работаем как программисты.
Контейнер — это объект, в котором хранится набор элементов (то есть других объектов). Каждый из этих контейнеров управляет пространством для хранения своих элементов и предоставляет доступ к каждому элементу через итераторы и/или функции-члены.
Стандартные контейнеры реализуют структуры, которые обычно используются в наших программах, например:
- динамические массивы
- очереди
- штабеля
- связанных списка
- деревья
- ассоциативный набор
Мне нравятся контейнеры STL, так как они устраняют весь набор стандартного кода, который я повторно реализую в каждом проекте, над которым работаю. Библиотека контейнеров также выигрывает от наличия стандартизированного интерфейса для функций-членов. Эти стандартизированные интерфейсы уменьшают нагрузку на память и позволяют использовать контейнеры с алгоритмами STL.
Библиотека контейнеров C++ подразделяет контейнеры на четыре типа:
- Контейнеры последовательностей
- Адаптеры контейнеров для последовательности
- Ассоциативные контейнеры
- Неупорядоченные ассоциативные контейнеры
Давайте углубимся в каждую из этих категорий.
Контейнеры последовательности
Контейнеры последовательности используются для структур данных, которые линейно хранят объекты одного типа.
Типы STL SequenceContainer :
-
массивпредставляет статический непрерывный массив -
векторпредставляет динамический непрерывный массив -
forward_listпредставляет односвязный список -
списокпредставляет собой двусвязный список -
dequeпредставляет двустороннюю очередь, элементы которой можно добавлять в начало или конец очереди.
Хотя std::string не включен в большинство списков контейнеров, на самом деле он соответствует требованиям Контейнер последовательности .
Адаптеры для контейнеров
Адаптеры для контейнеров представляют собой особый тип класса контейнеров. Они не являются полными контейнерными классами сами по себе, а являются оболочками для других типов контейнеров (таких как vector , deque или list ).
Эти адаптеры контейнеров инкапсулируют базовый тип контейнера и соответствующим образом ограничивают пользовательские интерфейсы.
Рассмотрим std::stack . std::stack — это контейнер, реализующий структуру данных типа LIFO. Вот декларация std::stack :
шаблон <
класс Т,
Контейнер класса = std::deque
> стек классов; Обратите внимание, что Container по умолчанию является оболочкой std::deque . На самом деле вы можете изменить тип базового контейнера на другой STL SequenceContainer или свой собственный контейнер. Указанный вами контейнер должен соответствовать следующим требованиям:
- Контейнер должен удовлетворять требованиям SequenceContainer
- Должен предоставлять
back(),push_back()иpop_back()интерфейсы
Контейнеры STL std::vector , std::deque и std::list соответствуют этим требованиям и могут использоваться для базового хранилища.
Стандартные адаптеры контейнеров:
-
стекобеспечивает структуру данных LIFO -
очередьобеспечивает структуру данных FIFO -
priority_queueобеспечивает приоритетную очередь, которая позволяет постоянно искать самый большой элемент (по умолчанию)
Ассоциативные контейнеры
Ассоциативные контейнеры предоставляют отсортированные структуры данных, обеспечивающие быстрый поиск ( O(log n) времени) с использованием ключей.
Типы STL AssociativeContainer можно разделить на два типа: контейнеры, для которых требуются уникальные ключи, и контейнеры, допускающие несколько записей с использованием одного и того же ключа.
- Ключи уникальны
-
наборпредставляет собой набор уникальных ключей, отсортированных по ключам -
картапредставляет собой набор пар ключ-значение, отсортированных по ключам -
набори картаобычно реализуются с использованием красно-черных деревьев
-
- Разрешено несколько записей для одного и того же ключа
-
мультимножествопредставляет собой набор ключей, отсортированных по ключам -
multimapпредставляет собой набор пар ключ-значение, отсортированных по ключам
-
Каждый из ассоциативных контейнеров может указывать функцию сравнения при объявлении.
Давайте посмотрим на определение std::set :
template<
ключ класса,
класс Compare = std::less,
класс Распределитель = std::allocator<Ключ>
> набор классов; Функция сравнения по умолчанию для ассоциативных контейнеров — std::less . Эта функция сравнения используется для сортировки ключей. Если вы предпочитаете другую схему сортировки или распределения, вы должны переопределить эти функции во время объявления.
Неупорядоченные ассоциативные контейнеры
Неупорядоченные ассоциативные контейнеры предоставляют несортированные структуры данных, доступ к которым можно получить с помощью хэша. Время доступа в худшем случае равно O(n), но для большинства операций оно намного быстрее, чем линейное время.
Для всех типов STL UnorderedAssociativeContainer для доступа к данным используется хешированный ключ. Подобно AssociativeContainer , стандартные типы разделены на те, для которых требуются уникальные ключи, и те, для которых они не требуются:
- Ключи уникальны
-
неупорядоченный наборпредставляет собой набор ключей, хэшированных по ключам -
unordered_mapпредставляет собой набор пар ключ-значение, хешированных ключами
-
- Допускается несколько целых чисел для одного и того же ключа
-
unordered_multisetпредставляет собой набор ключей, хешированных по ключам -
unordered_multimapпредставляет собой набор пар ключ-значение, хешированных ключами
-
Как и в случае с другими типами контейнеров, типы UnorderedAssociativeContainer могут иметь переопределенные детали.
Давайте посмотрим на std::unordered_set :
template<
ключ класса,
класс Хэш = std::hash,
класс KeyEqual = std::equal_to,
класс Распределитель = std::allocator<Ключ>
> класс unordered_set; Вы можете переопределить функцию хеширования, функцию сравнения ключей и распределитель. Я не хочу улучшать функциональность хэширования STL, поэтому обычно не обращаю внимания на эти детали. Однако, если вы хотите переопределить любую из функций по умолчанию, вы должны сделать это во время объявления.
Причины использования стандартных контейнеров
Стандартные контейнеры избавляют от большей части шаблонного кода, который мне приходится писать при настройке новой системы для нового клиента. Они упрощают разработку и должны использоваться вместо пользовательских реализаций по четырем простым причинам:
- Контейнеры STL реализованы правильно, и мне не нужно будет тратить время на отладку контейнеров Контейнеры
- STL работают быстро и, вероятно, более эффективно, чем все, что я собираюсь реализовать самостоятельно
- Контейнеры STL имеют общие интерфейсы, что упрощает использование разных контейнеров без поиска определений функций-членов
- Контейнеры STL хорошо документированы и легко понятны другим разработчикам, что повышает понятность и удобство сопровождения наших проектов
Используя контейнеры STL, я могу стать более продуктивным разработчиком.
Я гораздо больше уверен в надежности своего кода и могу быть уверен, что другим разработчикам будет легче поддерживать мой код в будущем.
Стандартная безопасность потока контейнера
Я хочу поделиться с вами некоторыми важными моментами, касающимися безопасности потока контейнера, поскольку многие встроенные системы, вероятно, потребуют совместного использования объектов между потоками. Применяются следующие общие правила безопасности потоков:
- Все функции контейнера безопасно вызывать одновременно для разных объектов одного и того же типа контейнера (т. е. можно безопасно использовать два разных экземпляра
std::vectorв двух разных потоках - Все
constфункции-члены могут вызываться одновременно разными потоками - Контейнеры можно безопасно читать из нескольких потоков, если ни один из потоков не выполняет асинхронную запись
- Различные элементы в одном контейнере могут быть изменены одновременно, кроме элементов
std::vector.
- Если объект записывается одним потоком и читается другими потоками, объект должен быть защищен
- Как правило, операции итератора считываются из контейнера, но не изменяют его, поэтому они потокобезопасны.
- Операции с контейнером, которые делают недействительными итераторы, НЕ являются потокобезопасными, поскольку они модифицируют контейнер
Самая важная деталь, о которой следует помнить: если вы изменяете контейнер в нескольких потоках, вам необходимо защитить этот контейнер, чтобы предотвратить одновременный доступ. Дополнительные сведения об использовании контейнеров потокобезопасным способом см. в разделе Реализация потокобезопасной очереди с использованием условной переменной
. Кроме того, Boost предоставляет набор альтернативных контейнеров без блокировок, которые можно использовать для многопоточных сценариев использования.
Дополнительная литература
Я стремился предоставить обзор контейнеров, доступных в C++.
В последующих статьях мы будем использовать эти контейнеры для создания нашей встраиваемой системы. Я рекомендую прочитать документацию для любых контейнеров, которые вас сразу заинтересуют.
- cppreference: Контейнеры
- ISO CPP: Часто задаваемые вопросы о контейнерах
- Microsoft: безопасность потоков в стандартной библиотеке C++
- Реализация потокобезопасной очереди с использованием условных переменных
- Товары для встраиваемых контейнеров Artistry
- Введение в
std::array - Введение в
std::vector - Откажитесь от встроенных массивов в пользу контейнеров C++
- На основе диапазона
дляциклов - Воспользуйтесь преимуществами RAII/SBRM
-
std::stringпротив C-строки
- Введение в
- Концепции контейнеров
-
Контейнер -
Контейнер последовательности -
Ассоциативный контейнер -
UnorderedAssociativeContainer -
Сравнить - Красно-черное дерево
-
- Контейнеры последовательности
-
станд::массив -
станд::вектор -
стандартная::дек -
std::forward_list -
станд::список
-
- Адаптеры для контейнеров
-
станд::стек -
стд::очередь -
стд::priority_queue
-
- Ассоциативные контейнеры
-
станд::набор -
станд::карта -
станд::мультисет -
станд::мультимап
-
- Неупорядоченные ассоциативные контейнеры
-
стд::неупорядоченный набор -
стд::неупорядоченный_мультисет -
std::unordered_map -
стандартная:: unordered_multimap
-
Основные изменения
- 20181026:
- Обновлены примечания по безопасности потоков для неупорядоченных ассоциативных контейнеров.

- Обновлены примечания по безопасности потоков для неупорядоченных ассоциативных контейнеров.


[редактировать]
= std::equal_to
Этот итератор 
