multiset(); (1)(until C++11)multiset():multiset(Compare()){}(since C++11)explicitmultiset(constCompare&comp,constAllocator&alloc=Allocator()); (2) explicitmultiset(constAllocator&alloc); (3) (since C++11)template<classInputIt>multiset(InputItfirst,InputItlast,constCompare&comp=Compare(),constAllocator&alloc=Allocator()); (4)template<classInputIt>multiset(InputItfirst,InputItlast,constAllocator&alloc):multiset(first,last,Compare(),alloc){} (5) (since C++14)multiset(constmultiset&other); (6) multiset(constmultiset&other,constAllocator&alloc); (7) (since C++11)multiset(multiset&&other); (8)(since C++11)multiset(multiset&&other,constAllocator&alloc); (9) (since C++11)multiset(std::initializer_list<value_type>init,constCompare&comp=Compare(),constAllocator&alloc=Allocator()); (10) (since C++11)multiset(std::initializer_list<value_type>init,constAllocator&alloc):multiset(init,Compare(),alloc){} (11) (since C++14)template<container-compatible-range<value_type>R>multiset(std::from_range_t,R&&rg,constCompare&comp=Compare(),constAllocator&alloc=Allocator()); (12)(since C++23)template<container-compatible-range<value_type>R>multiset(std::from_range_t,R&&rg,constAllocator&alloc):multiset(std::from_range,std::forward<R>(rg),Compare(),alloc){} (13) (since C++23)Constructs new container from a variety of data sources and optionally using user supplied allocator alloc or comparison function object comp.
1-3) Constructs an empty container.
4,5) Constructs the container with the contents of the range [first, last).
If [first, last) is not a
, the behavior is undefined.
6,7)
. Constructs the container with the copy of the contents of other.
If alloc is not provided, allocator is obtained by calling
std::allocator_traits<allocator_type>::select_on_container_copy_construction(other.get_allocator())(since C++11)During
class template argument deduction
, only the first argument contributes to the deduction of the container's Allocator template parameter.
(since C++23)8,9)
. Constructs the container with the contents of other using move semantics. If alloc is not provided, allocator is obtained by move-construction from the allocator belonging to other.
12,13) Constructs the container with the contents of rg.
Parameters
alloc - allocator to use for all memory allocations of this container comp - comparison function object to use for all comparisons of keys first, last - the pair of iterators defining the source
of elements to copy other - another container to be used as source to initialize the elements of the container with init - initializer list to initialize the elements of the container with rg - a
, that is, an
whose elements are convertible to
Type requirements -InputIt must meet the requirements of
. -Compare must meet the requirements of
. -Allocator must meet the requirements of
. Complexity
1-3) Constant.
4,5)N·log(N) where N is std::distance(first,last) in general, linear in N if [first, last) is already sorted by value_comp().
6,7) Linear in size of other.
8,9) Constant. If alloc is given and alloc!=other.get_allocator(), then linear.
10,11)N·log(N) where N is init.size() in general, linear in N if init is already sorted by value_comp().
12,13)N·log(N) where N is ranges::distance(rg) in general, linear in N if rg is already sorted by value_comp().
Exceptions
Calls to Allocator::allocate may throw.
Notes
After container move construction (overload (
)), references, pointers, and iterators that originally refer to elements in other remain valid, but refer to elements that are now in *this. The current standard makes this guarantee via the blanket statement in
, and a more direct guarantee is under consideration via
.
Although not formally required until C++23, some implementations has already put the template parameter Allocator into
in earlier modes.
macroValueStdFeature
(C++23)
construction and insertion; overloads (
)Example
Run this code
#include<iostream>#include<set>#include<string_view>template<typenameT>voidprintln(conststd::string_viewname,conststd::multiset<T>&ms){std::cout<<name<<": ";for(constauto&element:ms)std::cout<<element<<' ';std::cout<<'\n';}intmain(){// (1) Default constructorstd::multiset<int>a;a.insert(4);a.insert(3);a.insert(2);a.insert(1);println("a",a);// (4) Range constructorstd::multiset<int>b(a.begin(),a.find(3));println("b",b);// (6) Copy constructorstd::multiset<int>c(a);println("c",c);// (8) Move constructorstd::multiset<int>d(std::move(a));println("d",d);// (10) Initializer list constructorstd::multiset<int>e{3,2,1,2,4,7,3};println("e",e);// (12) Range constructorconstautow={"α","β","γ","δ","δ","γ","β","α"};#if __cpp_lib_containers_rangesstd::multiset<std::string>f(std::from_range,w);// overload (12)#elsestd::multiset<std::string>f(w.begin(),w.end());// fallback to (4)#endifprintln("f",f);}Output:
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: α α β β γ γ δ δ Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++11 overload (
) conditionally required Key to be
into *thisnot required
C++11 the default constructor was explicit made non-explicit See also