[flat.multiset.defn] # 23 Containers library [[containers]](./#containers) ## 23.6 Container adaptors [[container.adaptors]](container.adaptors#flat.multiset.defn) ### 23.6.12 Class template flat_multiset [[flat.multiset]](flat.multiset#defn) #### 23.6.12.2 Definition [flat.multiset.defn] namespace std {template, class KeyContainer = vector>class flat_multiset {public:// typesusing key_type = Key; using value_type = Key; using key_compare = Compare; using value_compare = Compare; using reference = value_type&; using const_reference = const value_type&; using size_type = typename KeyContainer::size_type; using difference_type = typename KeyContainer::difference_type; using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; using container_type = KeyContainer; // [[flat.multiset.cons]](flat.multiset.cons "23.6.12.3 Constructors"), constructorsconstexpr flat_multiset() : flat_multiset(key_compare()) { }constexpr explicit flat_multiset(const key_compare& comp): *c*(), *compare*(comp) { }constexpr explicit flat_multiset(container_type cont, const key_compare& comp = key_compare()); constexpr flat_multiset(sorted_equivalent_t, container_type cont, const key_compare& comp = key_compare()): *c*(std::move(cont)), *compare*(comp) { }templateconstexpr flat_multiset(InputIterator first, InputIterator last, const key_compare& comp = key_compare()): *c*(), *compare*(comp){ insert(first, last); }templateconstexpr flat_multiset(sorted_equivalent_t, InputIterator first, InputIterator last, const key_compare& comp = key_compare()): *c*(first, last), *compare*(comp) { }template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]") R>constexpr flat_multiset(from_range_t, R&& rg): flat_multiset(from_range, std::forward(rg), key_compare()) { }template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]") R>constexpr flat_multiset(from_range_t, R&& rg, const key_compare& comp): flat_multiset(comp){ insert_range(std::forward(rg)); }constexpr flat_multiset(initializer_list il, const key_compare& comp = key_compare()): flat_multiset(il.begin(), il.end(), comp) { }constexpr flat_multiset(sorted_equivalent_t, initializer_list il, const key_compare& comp = key_compare()): flat_multiset(sorted_equivalent, il.begin(), il.end(), comp) { }// [[flat.multiset.cons.alloc]](flat.multiset.cons.alloc "23.6.12.4 Constructors with allocators"), constructors with allocatorstemplateconstexpr explicit flat_multiset(const Alloc& a); templateconstexpr flat_multiset(const key_compare& comp, const Alloc& a); templateconstexpr flat_multiset(const container_type& cont, const Alloc& a); templateconstexpr flat_multiset(const container_type& cont, const key_compare& comp, const Alloc& a); templateconstexpr flat_multiset(sorted_equivalent_t, const container_type& cont, const Alloc& a); templateconstexpr flat_multiset(sorted_equivalent_t, const container_type& cont, const key_compare& comp, const Alloc& a); templateconstexpr flat_multiset(const flat_multiset&, const Alloc& a); templateconstexpr flat_multiset(flat_multiset&&, const Alloc& a); templateconstexpr flat_multiset(InputIterator first, InputIterator last, const Alloc& a); templateconstexpr flat_multiset(InputIterator first, InputIterator last, const key_compare& comp, const Alloc& a); templateconstexpr flat_multiset(sorted_equivalent_t, InputIterator first, InputIterator last, const Alloc& a); templateconstexpr flat_multiset(sorted_equivalent_t, InputIterator first, InputIterator last, const key_compare& comp, const Alloc& a); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]") R, class Alloc>constexpr flat_multiset(from_range_t, R&& rg, const Alloc& a); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]") R, class Alloc>constexpr flat_multiset(from_range_t, R&& rg, const key_compare& comp, const Alloc& a); templateconstexpr flat_multiset(initializer_list il, const Alloc& a); templateconstexpr flat_multiset(initializer_list il, const key_compare& comp, const Alloc& a); templateconstexpr flat_multiset(sorted_equivalent_t, initializer_list il, const Alloc& a); templateconstexpr flat_multiset(sorted_equivalent_t, initializer_list il, const key_compare& comp, const Alloc& a); constexpr flat_multiset& operator=(initializer_list); // iteratorsconstexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept; constexpr reverse_iterator rbegin() noexcept; constexpr const_reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() noexcept; constexpr const_reverse_iterator rend() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cend() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept; constexpr const_reverse_iterator crend() const noexcept; // capacityconstexpr bool empty() const noexcept; constexpr size_type size() const noexcept; constexpr size_type max_size() const noexcept; // [[flat.multiset.modifiers]](flat.multiset.modifiers "23.6.12.5 Modifiers"), modifierstemplate constexpr iterator emplace(Args&&... args); templateconstexpr iterator emplace_hint(const_iterator position, Args&&... args); constexpr iterator insert(const value_type& x){ return emplace(x); }constexpr iterator insert(value_type&& x){ return emplace(std::move(x)); }constexpr iterator insert(const_iterator position, const value_type& x){ return emplace_hint(position, x); }constexpr iterator insert(const_iterator position, value_type&& x){ return emplace_hint(position, std::move(x)); }templateconstexpr void insert(InputIterator first, InputIterator last); templateconstexpr void insert(sorted_equivalent_t, InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]") R>constexpr void insert_range(R&& rg); constexpr void insert(initializer_list il){ insert(il.begin(), il.end()); }constexpr void insert(sorted_equivalent_t, initializer_list il){ insert(sorted_equivalent, il.begin(), il.end()); }constexpr container_type extract() &&; constexpr void replace(container_type&&); constexpr iterator erase(iterator position); constexpr iterator erase(const_iterator position); constexpr size_type erase(const key_type& x); template constexpr size_type erase(K&& x); constexpr iterator erase(const_iterator first, const_iterator last); constexpr void swap(flat_multiset& y) noexcept; constexpr void clear() noexcept; // observersconstexpr key_compare key_comp() const; constexpr value_compare value_comp() const; // set operationsconstexpr iterator find(const key_type& x); constexpr const_iterator find(const key_type& x) const; template constexpr iterator find(const K& x); template constexpr const_iterator find(const K& x) const; constexpr size_type count(const key_type& x) const; template constexpr size_type count(const K& x) const; constexpr bool contains(const key_type& x) const; template constexpr bool contains(const K& x) const; constexpr iterator lower_bound(const key_type& x); constexpr const_iterator lower_bound(const key_type& x) const; template constexpr iterator lower_bound(const K& x); template constexpr const_iterator lower_bound(const K& x) const; constexpr iterator upper_bound(const key_type& x); constexpr const_iterator upper_bound(const key_type& x) const; template constexpr iterator upper_bound(const K& x); template constexpr const_iterator upper_bound(const K& x) const; constexpr pair equal_range(const key_type& x); constexpr pair equal_range(const key_type& x) const; templateconstexpr pair equal_range(const K& x); templateconstexpr pair equal_range(const K& x) const; friend constexpr bool operator==(const flat_multiset& x, const flat_multiset& y); friend constexpr *synth-three-way-result*operator<=>(const flat_multiset& x, const flat_multiset& y); friend constexpr void swap(flat_multiset& x, flat_multiset& y) noexcept{ x.swap(y); }private: container_type *c*; // *exposition only* key_compare *compare*; // *exposition only*}; template> flat_multiset(KeyContainer, Compare = Compare())-> flat_multiset; template flat_multiset(KeyContainer, Allocator)-> flat_multiset, KeyContainer>; template flat_multiset(KeyContainer, Compare, Allocator)-> flat_multiset; template> flat_multiset(sorted_equivalent_t, KeyContainer, Compare = Compare())-> flat_multiset; template flat_multiset(sorted_equivalent_t, KeyContainer, Allocator)-> flat_multiset, KeyContainer>; template flat_multiset(sorted_equivalent_t, KeyContainer, Compare, Allocator)-> flat_multiset; template>> flat_multiset(InputIterator, InputIterator, Compare = Compare())-> flat_multiset<*iter-value-type*, Compare>; template>> flat_multiset(sorted_equivalent_t, InputIterator, InputIterator, Compare = Compare())-> flat_multiset<*iter-value-type*, Compare>; template>, class Allocator = allocator>> flat_multiset(from_range_t, R&&, Compare = Compare(), Allocator = Allocator())-> flat_multiset, Compare, vector, *alloc-rebind*>>>; template flat_multiset(from_range_t, R&&, Allocator)-> flat_multiset, less>, vector, *alloc-rebind*>>>; template> flat_multiset(initializer_list, Compare = Compare())-> flat_multiset; template> flat_multiset(sorted_equivalent_t, initializer_list, Compare = Compare())-> flat_multiset; templatestruct uses_allocator, Allocator>: bool_constant> { };}