Spec-Zone.ru › C++

std::multiset

Определён в заголовочном файле <set>
template<
    class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>
> class multiset;
(1)
namespace pmr {
    template<
        class Key,
        class Compare = std::less<Key>
    > using multiset = std::multiset<Key, Compare, std::pmr::polymorphic_allocator<Key>>;
}
(2) (начиная с C++17)

std::multiset — это ассоциативный контейнер, содержащий отсортированный набор объектов типа Key. В отличие от set, допускается наличие нескольких ключей с эквивалентными значениями. Сортировка выполняется с помощью функции сравнения ключей Compare. Операции поиска, вставки и удаления имеют логарифмическую сложность.

Везде, где стандартная библиотека предъявляет требования Compare, эквивалентность определяется с помощью отношения эквивалентности, описанного в разделе Compare. В нестрогом смысле два объекта a и b считаются эквивалентными, если ни один из них не сравнивается как меньший другого: !comp(a, b) && !comp(b, a).

Порядок элементов, сравниваемых как эквивалентные, совпадает с порядком их вставки и не изменяется.

(начиная с C++11)

std::multiset соответствует требованиям Container, AllocatorAwareContainer, AssociativeContainer и ReversibleContainer.

Все функции-члены std::multiset являются constexpr: объекты std::multiset можно создавать и использовать при вычислении константного выражения.

Однако объявление переменной constexpr std::multiset обычно является ошибкой, поскольку при константном вычислении требуется освободить любое динамически выделенное хранилище в рамках того же вычисления, чего обычно не происходит при инициализации std::multiset.

(начиная с C++26)

Параметры шаблона

Типы-члены

Тип Определение
key_type Key
value_type Key
size_type целочисленный тип без знака (обычно std::size_t)
difference_type целочисленный тип со знаком (обычно std::ptrdiff_t)
key_compare Compare
value_compare Compare
allocator_type Allocator
reference value_type&
const_reference constvalue_type&
pointer

Allocator::pointer

(до C++11)

std::allocator_traits<Allocator>::pointer

(начиная с C++11)
const_pointer

Allocator::const_pointer

(до C++11)

std::allocator_traits<Allocator>::const_pointer

(начиная с C++11)
iterator Константный LegacyBidirectionalIterator и ConstexprIterator(начиная с C++26) к value_type
const_iterator LegacyBidirectionalIterator и ConstexprIterator(начиная с C++26) к constvalue_type
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>
node_type (начиная с C++17) специализация дескриптора узла, представляющая узел контейнера

Функции-члены

(constructor)
создаёт multiset
(открытая функция-член)
(destructor)
уничтожает multiset
(открытая функция-член)
operator=
присваивает значения контейнеру
(открытая функция-член)
get_allocator
возвращает связанный с контейнером аллокатор
(открытая функция-член)
Итераторы
begincbegin
(C++11)
возвращает итератор на начало
(открытая функция-член)
endcend
(C++11)
возвращает итератор на конец
(открытая функция-член)
rbegincrbegin
(C++11)
возвращает обратный итератор на начало
(открытая функция-член)
rendcrend
(C++11)
возвращает обратный итератор на конец
(открытая функция-член)
Ёмкость
empty
проверяет, пуст ли контейнер
(открытая функция-член)
size
возвращает количество элементов
(открытая функция-член)
max_size
возвращает максимально возможное количество элементов
(открытая функция-член)
Модификаторы
clear
очищает содержимое
(открытая функция-член)
insert
вставляет элементы или узлы(начиная с C++17)
(открытая функция-член)
insert_range
(C++23)
вставляет диапазон элементов
(открытая функция-член)
emplace
(C++11)
создаёт элемент на месте
(открытая функция-член)
emplace_hint
(C++11)
создаёт элементы на месте, используя подсказку
(открытая функция-член)
erase
удаляет элементы
(открытая функция-член)
swap
обменивает содержимое
(открытая функция-член)
extract
(C++17)
извлекает узлы из контейнера
(открытая функция-член)
merge
(C++17)
перемещает узлы из другого контейнера
(открытая функция-член)
Поиск
count
возвращает количество элементов с заданным ключом
(открытая функция-член)
find
находит элемент с заданным ключом
(открытая функция-член)
contains
(C++20)
проверяет, содержит ли контейнер элемент с заданным ключом
(открытая функция-член)
equal_range
возвращает диапазон элементов с заданным ключом
(открытая функция-член)
lower_bound
возвращает итератор на первый элемент, который не меньше заданного ключа
(открытая функция-член)
upper_bound
возвращает итератор на первый элемент, который больше заданного ключа
(открытая функция-член)
Наблюдатели
key_comp
возвращает функцию сравнения ключей
(открытая функция-член)
value_comp
возвращает функцию сравнения ключей объектов типа value_type
(открытая функция-член)

Функции, не являющиеся членами

operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалены в C++20)(удалены в C++20)(удалены в C++20)(удалены в C++20)(удалены в C++20)(C++20)
лексикографически сравнивает значения двух multiset
(шаблон функции)
std::swap(std::multiset)
специализирует алгоритм std::swap
(шаблон функции)
erase_if(std::multiset)
(C++20)
удаляет все элементы, удовлетворяющие заданному условию
(шаблон функции)

Руководства по выводу типов

(начиная с C++17)

Примечания

Типы-члены iterator и const_iterator могут быть псевдонимами одного и того же типа. Это означает, что определение пары перегруженных функций, использующих эти типы в качестве типов параметров, может нарушить правило одного определения. Поскольку iterator преобразуется в const_iterator, вместо этого можно использовать одну функцию с параметром типа const_iterator.

Макрос проверки поддержки функции Значение Стандарт Функция
__cpp_lib_containers_ranges 202202L (C++23) Создание и вставка элементов в контейнеры с использованием диапазонов
__cpp_lib_constexpr_set 202502L (C++26) Константное выражение std::multiset

Пример

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Правильное поведение
LWG 103 C++98 iterator допускает изменение ключей iterator сделан константным
LWG 230 C++98 Key не обязан был удовлетворять требованиям CopyConstructible
(ключ типа Key мог оказаться невозможным для создания)
Key также должен
удовлетворять требованиям CopyConstructible

См. также

set
коллекция уникальных ключей, отсортированных по ключам
(шаблон класса)
unordered_multiset
(C++11)
коллекция ключей с хешированием по ключам
(шаблон класса)
flat_multiset
(C++23)
адаптирует контейнер для хранения коллекции ключей, отсортированных по ключам
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/multiset

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API