Namespaces
Variants

std::multiset<Key,Compare,Allocator>:: multiset

From cppreference.net

(1)
multiset ( ) ;
(до C++11)
multiset ( ) : multiset ( Compare ( ) ) { }
(начиная с C++11)
(constexpr начиная с C++26)
explicit multiset ( const Compare & comp,
const Allocator & alloc = Allocator ( ) ) ;
(2) (constexpr начиная с C++26)
explicit multiset ( const Allocator & alloc ) ;
(3) (начиная с C++11)
(constexpr начиная с C++26)
template < class InputIt >

multiset ( InputIt first, InputIt last,
const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(4) (constexpr начиная с C++26)
template < class InputIt >

multiset ( InputIt first, InputIt last,
const Allocator & alloc )

: multiset ( first, last, Compare ( ) , alloc ) { }
(5) (начиная с C++14)
(constexpr начиная с C++26)
multiset ( const multiset & other ) ;
(6) (constexpr начиная с C++26)
multiset ( const multiset & other, const Allocator & alloc ) ;
(7) (начиная с C++11)
(constexpr начиная с C++26)
multiset ( multiset && other ) ;
(8) (начиная с C++11)
(constexpr начиная с C++26)
multiset ( multiset && other, const Allocator & alloc ) ;
(9) (начиная с C++11)
(constexpr начиная с C++26)
multiset ( std:: initializer_list < value_type > init,

const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(10) (начиная с C++11)
(constexpr начиная с C++26)
multiset ( std:: initializer_list < value_type > init,

const Allocator & alloc )

: multiset ( init, Compare ( ) , alloc ) { }
(11) (начиная с C++14)
(constexpr начиная с C++26)
template < container-compatible-range < value_type > R >

multiset ( std:: from_range_t , R && rg,
const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(12) (начиная с C++23)
(constexpr начиная с C++26)
template < container-compatible-range < value_type > R >

multiset ( std:: from_range_t , R && rg,
const Allocator & alloc )

: multiset ( std:: from_range , std:: forward < R > ( rg ) , Compare ( ) , alloc ) { }
(13) (начиная с C++23)
(constexpr начиная с C++26)

Создает новый контейнер из различных источников данных и, опционально, с использованием предоставленного пользователем аллокатора alloc или функционального объекта сравнения comp .

1-3) Создает пустой контейнер.
4,5) Конструирует контейнер с содержимым диапазона [ first , last ) .
Если [ first , last ) не является допустимым диапазоном , поведение не определено.
6,7) Создает контейнер с копией содержимого other .

Если alloc не предоставлен, аллокатор получается путем вызова std:: allocator_traits < allocator_type > ::
select_on_container_copy_construction ( other. get_allocator ( ) )
.

(since C++11)

Во время вывода аргументов шаблона класса только первый аргумент участвует в выводе параметра шаблона Allocator контейнера.

(since C++23)
8,9) Конструирует контейнер с содержимым other с использованием семантики перемещения. Если alloc не предоставлен, аллокатор получается путем перемещающего конструирования из аллокатора, принадлежащего other .

Во время вывода аргументов шаблона класса только первый аргумент участвует в выводе параметра шаблона Allocator контейнера.

(since C++23)
10,11) Конструирует контейнер с содержимым списка инициализации init .
12,13) Конструирует контейнер с содержимым rg .

Содержание

Параметры

alloc - аллокатор для использования во всех выделениях памяти этого контейнера
comp - функциональный объект сравнения для использования во всех сравнениях ключей
first, last - пара итераторов, определяющая исходный диапазон элементов для копирования
other - другой контейнер, используемый в качестве источника для инициализации элементов контейнера
init - список инициализации для инициализации элементов контейнера
rg - совместимый с контейнером диапазон , то есть input_range , элементы которого конвертируются в value_type
Требования к типам
-
InputIt должен удовлетворять требованиям LegacyInputIterator .
-
Compare должен удовлетворять требованиям Compare .
-
Allocator должен удовлетворять требованиям Allocator .

Сложность

1-3) Константа.
4,5) N·log(N) где N равно std:: distance ( first, last ) в общем случае, линейно по N если [ first , last ) уже отсортирован согласно value_comp ( ) .
6,7) Линейно по размеру other .
8,9) Константная. Если alloc задан и alloc ! = other. get_allocator ( ) , то линейная.
10,11) N·log(N) где N это init. size ( ) в общем случае, линейно по N если init уже отсортирован с помощью value_comp ( ) .
12,13) N·log(N) где N это ranges:: distance ( rg ) в общем случае, линейно по N если rg уже отсортирован с помощью value_comp ( ) .

Исключения

Вызовы Allocator::allocate могут генерировать исключения.

Примечания

После перемещающего конструирования контейнера (перегрузка ( 8,9 ) ), ссылки, указатели и итераторы (кроме конечного итератора) на other остаются действительными, но ссылаются на элементы, которые теперь находятся в * this . Текущий стандарт обеспечивает эту гарантию с помощью общего положения в [container.reqmts]/67 , и более прямая гарантия рассматривается через LWG issue 2321 .

Хотя формально это не требовалось до C++23, некоторые реализации уже поместили параметр шаблона Allocator в невыводимые контексты в более ранних режимах.

Feature-test macro Value Std Feature
__cpp_lib_containers_ranges 202202L (C++23) Ranges-aware construction and insertion; overloads ( 12,13 )

Пример

#include <iostream>
#include <set>
#include <string_view>
template <typename T>
void println(const std::string_view name, const std::multiset<T>& ms)
{
    std::cout << name << ": ";
    for (const auto& element : ms)
        std::cout << element << ' ';
    std::cout << '\n';
}
int main()
{
    // (1) Конструктор по умолчанию
    std::multiset<int> a;
    a.insert(4);
    a.insert(3);
    a.insert(2);
    a.insert(1);
    println("a", a);
    // (4) Конструктор диапазона
    std::multiset<int> b(a.begin(), a.find(3));
    println("b", b);
    // (6) Конструктор копирования
    std::multiset<int> c(a);
    println("c", c);
    // (8) Конструктор перемещения
    std::multiset<int> d(std::move(a));
    println("d", d);
    // (10) Конструктор списка инициализации
    std::multiset<int> e{3, 2, 1, 2, 4, 7, 3};
    println("e", e);
    // (12) Конструктор диапазона
    const auto w = {"α", "β", "γ", "δ", "δ", "γ", "β", "α"};
#if __cpp_lib_containers_ranges
    std::multiset<std::string> f(std::from_range, w); // перегрузка (12)
#else
    std::multiset<std::string> f(w.begin(), w.end()); // откат к (4)
#endif
    println("f", f);
}

Вывод:

a: 1 2 3 4
b: 1 2
c: 1 2 3 4
d: 1 2 3 4
e: 1 2 2 3 3 4 7
f: α α β β γ γ δ δ

Отчеты о дефектах

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

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2076 C++11 перегрузка ( 4 ) условно требовала, чтобы Key был CopyInsertable в * this не требуется
LWG 2193 C++11 конструктор по умолчанию был explicit сделан non-explicit

Смотрите также

присваивает значения контейнеру
(public member function)