STD::MULTISET(3cxx)
std::multiset โ part 1 of 4, bestie ๐
Okay so this is the std::multiset<...mpare, _Alloc >(3cxx) manual page, and we're doing it in four parts. This is part 1, and I'm keeping every single detail because that's the whole assignment. No skipping, no vibes-based summarising, periodt.
๐ธ NAME ๐ธ
std::multiset< _Key, _Compare, _Alloc > โ a standard container made up of elements, which can be retrieved in logarithmic time. That's the name section, short and iconic.
โจ SYNOPSIS โจ
First things first, you include this:
#include <set>
Then the page gives you the whole cast. Here we go, bestie.
๐ Public Types
These are the type aliases, exactly as written. No cap, this is the whole list:
typedef _Alloc allocator_typetypedef _Rep_type::const_iterator const_iteratortypedef _Alloc_traits::const_pointer const_pointertypedef _Alloc_traits::const_reference const_referencetypedef _Rep_type::const_reverse_iterator const_reverse_iteratortypedef _Rep_type::difference_type difference_typetypedef _Rep_type::const_iterator iteratortypedef _Compare key_comparetypedef _Key key_typeusing node_type = typename _Rep_type::node_typetypedef _Alloc_traits::pointer pointertypedef _Alloc_traits::reference referencetypedef _Rep_type::const_reverse_iterator reverse_iteratortypedef _Rep_type::size_type size_typetypedef _Compare value_comparetypedef _Key value_type
Yes, iterator is _Rep_type::const_iterator. That's what the page says. I'm not editing the source, I'm just adding sparkle. ๐ฆ
๐ซถ Public Member Functions
Okay, this is the long part. Where the page gives a description, I'm giving it to you in my voice. Where it gives no description, I'm just giving the exact signature and not inventing extra tea. Every overload is here.
multiset ()=defaultโ Default constructor creates no elements.template<typename _InputIterator > multiset (_InputIterator __first, _InputIterator __last)โ Builds a multiset from a range.template<typename _InputIterator > multiset (_InputIterator __first, _InputIterator __last, const _Compare &__comp, const allocator_type &__a=allocator_type())โ Builds a multiset from a range.template<typename _InputIterator > multiset (_InputIterator __first, _InputIterator __last, const allocator_type &__a)โ Allocator-extended range constructor.multiset (const _Compare &__comp, const allocator_type &__a=allocator_type())โ Creates a multiset with no elements.multiset (const allocator_type &__a)โ Allocator-extended default constructor.multiset (const multiset &)=defaultโ Multiset copy constructor.multiset (const multiset &__m, const __type_identity_t< allocator_type > &__a)โ Allocator-extended copy constructor.multiset (initializer_list< value_type > __l, const _Compare &__comp=_Compare(), const allocator_type &__a=allocator_type())โ Builds a multiset from an initializer_list.multiset (initializer_list< value_type > __l, const allocator_type &__a)โ Allocator-extended initialier-list constructor.multiset (multiset &&)=defaultโ Multiset move constructor.multiset (multiset &&__m, const __type_identity_t< allocator_type > &__a) noexcept(is_nothrow_copy_constructible< _Compare >::value &&_Alloc_traits::_S_always_equal())โ Allocator-extended move constructor.~multiset ()=defaultiterator begin () const noexceptiterator cbegin () const noexceptiterator cend () const noexceptvoid clear () noexceptreverse_iterator crbegin () const noexceptreverse_iterator crend () const noexcepttemplate<typename... _Args> iterator emplace (_Args &&... __args)โ Builds and inserts an element into the multiset.template<typename... _Args> iterator emplace_hint (const_iterator __pos, _Args &&... __args)โ Builds and inserts an element into the multiset.bool empty () const noexceptโ Returns true if the set is empty.iterator end () const noexceptsize_type erase (const key_type &__x)โ Erases elements according to the provided key._GLIBCXX_ABI_TAG_CXX11 iterator erase (const_iterator __first, const_iterator __last)โ Erases a [first,last) range of elements from a multiset._GLIBCXX_ABI_TAG_CXX11 iterator erase (const_iterator __position)โ Erases an element from a multiset.node_type extract (const key_type &__x)โ Extract a node.node_type extract (const_iterator __pos)โ Extract a node.allocator_type get_allocator () const noexceptโ Returns the memory allocation object.template<typename _InputIterator > void insert (_InputIterator __first, _InputIterator __last)โ A template function that tries to insert a range of elements.iterator insert (const value_type &__x)โ Inserts an element into the multiset.iterator insert (const_iterator __hint, node_type &&__nh)โ Re-insert an extracted node.iterator insert (const_iterator __position, const value_type &__x)โ Inserts an element into the multiset.iterator insert (const_iterator __position, value_type &&__x)void insert (initializer_list< value_type > __l)โ Attempts to insert a list of elements into the multiset.iterator insert (node_type &&__nh)โ Re-insert an extracted node.iterator insert (value_type &&__x)key_compare key_comp () constโ Returns the comparison object.size_type max_size () const noexceptโ Returns the maximum size of the set.template<typename _Compare1 > void merge (multiset< _Key, _Compare1, _Alloc > &&__source)template<typename _Compare1 > void merge (multiset< _Key, _Compare1, _Alloc > &__source)template<typename _Compare1 > void merge (set< _Key, _Compare1, _Alloc > &&__source)template<typename _Compare1 > void merge (set< _Key, _Compare1, _Alloc > &__source)multiset & operator= (const multiset &)=defaultโ Multiset assignment operator.multiset & operator= (initializer_list< value_type > __l)โ Multiset list assignment operator.multiset & operator= (multiset &&)=defaultโ Move assignment operator.reverse_iterator rbegin () const noexceptreverse_iterator rend () const noexceptsize_type size () const noexceptโ Returns the size of the set.void swap (multiset &__x) noexcept(/*conditional */)โ Swaps data with another multiset.value_compare value_comp () constโ Returns the comparison object.
And then the page has this indented lookup block, and I'm putting it right here because it's still member functions and we are not losing anybody:
size_type count (const key_type &__x) constโ Finds the number of elements with given key.template<typename _Kt > auto count (const _Kt &__x) const -> decltype(_M_t._M_count_tr(__x))โ Finds the number of elements with given key.bool contains (const key_type &__x) constโ Finds whether an element with the given key exists.template<typename _Kt > auto contains (const _Kt &__x) const -> decltype(_M_t._M_find_tr(__x), void(), true)โ Finds whether an element with the given key exists.iterator find (const key_type &__x)โ Tries to locate an element in a set.const_iterator find (const key_type &__x) constโ Tries to locate an element in a set.template<typename _Kt > auto find (const _Kt &__x) -> decltype(iterator{_M_t._M_find_tr(__x)})โ Tries to locate an element in a set.template<typename _Kt > auto find (const _Kt &__x) const -> decltype(const_iterator{_M_t._M_find_tr(__x)})โ Tries to locate an element in a set.iterator lower_bound (const key_type &__x)โ Finds the beginning of a subsequence matching given key.const_iterator lower_bound (const key_type &__x) constโ Finds the beginning of a subsequence matching given key.template<typename _Kt > auto lower_bound (const _Kt &__x) -> decltype(iterator(_M_t._M_lower_bound_tr(__x)))โ Finds the beginning of a subsequence matching given key.template<typename _Kt > auto lower_bound (const _Kt &__x) const -> decltype(iterator(_M_t._M_lower_bound_tr(__x)))โ Finds the beginning of a subsequence matching given key.iterator upper_bound (const key_type &__x)โ Finds the end of a subsequence matching given key.const_iterator upper_bound (const key_type &__x) constโ Finds the end of a subsequence matching given key.template<typename _Kt > auto upper_bound (const _Kt &__x) -> decltype(iterator(_M_t._M_upper_bound_tr(__x)))โ Finds the end of a subsequence matching given key.template<typename _Kt > auto upper_bound (const _Kt &__x) const -> decltype(iterator(_M_t._M_upper_bound_tr(__x)))โ Finds the end of a subsequence matching given key.std::pair< iterator, iterator > equal_range (const key_type &__x)โ Finds a subsequence matching given key.std::pair< const_iterator, const_iterator > equal_range (const key_type &__x) constโ Finds a subsequence matching given key.template<typename _Kt > auto equal_range (const _Kt &__x) -> decltype(pair< iterator, iterator >(_M_t._M_equal_range_tr(__x)))โ Finds a subsequence matching given key.template<typename _Kt > auto equal_range (const _Kt &__x) const -> decltype(pair< iterator, iterator >(_M_t._M_equal_range_tr(__x)))โ Finds a subsequence matching given key.
Yes, that last const templateequal_rangestill sayspair< iterator, iterator >in thedecltype. I'm copying it exactly, bestie. No "fixing" the source. ๐
๐ Friends
The VIP list, AKA the friend functions. Exact signatures only:
template<typename _K1 , typename _C1 , typename _A1 > bool operator< (const multiset< _K1, _C1, _A1 > &, const multiset< _K1, _C1, _A1 > &)template<typename _K1 , typename _C1 , typename _A1 > bool operator== (const multiset< _K1, _C1, _A1 > &, const multiset< _K1, _C1, _A1 > &)template<typename , typename > struct std::_Rb_tree_merge_helper
๐ Detailed Description ๐
The page literally shows this declaration, quote and all:
template<typename _Key, typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>>
class std::multiset< _Key, _Compare, _Alloc >"A standard container made up of elements, which can be retrieved in logarithmic time.
That dangling quote is literally on the page. I'm preserving it like a museum piece. Museum rules, bestie. ๐
Since: C++98
Template Parameters
_Keyโ Type of key objects._Compareโ Comparison function object type, defaults toless<_Key>._Allocโ Allocator type, defaults toallocator<_Key>.
It meets the requirements of a container, a reversible container, and an associative container (using equivalent keys). For a multiset<Key> the key_type and value_type are Key.
Multisets support bidirectional iterators.
The private tree data is declared exactly the same way for set and multiset; the distinction is made entirely in how the tree functions are called (*_unique versus *_equal, same as the standard).
๐ ๏ธ Constructor & Destructor Documentation ๐ ๏ธ
okay so construction time, bestie ๐ง this whole section is literally how you bring a multiset into existence (and how you clean it up). every signature is here, every default, every [inline], [explicit], [noexcept], no cap ๐
๐ผ default constructor: multiset () [default]
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset () [default]
Default constructor creates no elements. empty. blank slate. iconic โจ
๐ comparator + allocator constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset (const _Compare & __comp, const allocator_type & __a = allocator_type()) [inline], [explicit]
Creates a multiset with no elements.
Parameters
__compโ Comparator to use.__aโ An allocator object.
๐ฆ range constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _InputIterator > std::multiset< _Key, _Compare, _Alloc >::multiset (_InputIterator __first, _InputIterator __last) [inline]
Builds a multiset from a range.
Parameters
__firstโ An input iterator.__lastโ An input iterator.
Create a multiset consisting of copies of the elements from [first,last). This is linear in N if the range is already sorted, and NlogN otherwise (where N is distance(__first,__last)).
๐ธ range constructor + comparator + allocator
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _InputIterator > std::multiset< _Key, _Compare, _Alloc >::multiset (_InputIterator __first, _InputIterator __last, const _Compare & __comp, const allocator_type & __a = allocator_type()) [inline]
Builds a multiset from a range.
Parameters
__firstโ An input iterator.__lastโ An input iterator.__compโ A comparison functor.__aโ An allocator object.
Create a multiset consisting of copies of the elements from [__first,__last). This is linear in N if the range is already sorted, and NlogN otherwise (where N is distance(__first,__last)).
๐ copy constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset (const multiset< _Key, _Compare, _Alloc > &) [default]
Multiset copy constructor. Whether the allocator is copied depends on the allocator traits. yes bestie, the allocator lore is real ๐ซถ
๐ฅ move constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset (multiset< _Key, _Compare, _Alloc > &&) [default]
Multiset move constructor. The newly-created multiset contains the exact contents of the moved instance. The moved instance is a valid, but unspecified multiset.
๐ initializer_list constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset (initializer_list< value_type > __l, const _Compare & __comp = _Compare(), const allocator_type & __a = allocator_type()) [inline]
Builds a multiset from an initializer_list.
Parameters
__lโ An initializer_list.__compโ A comparison functor.__aโ An allocator object.
Create a multiset consisting of copies of the elements from the list. This is linear in N if the list is already sorted, and NlogN otherwise (where N is __l.size()).
๐ง allocator-extended default constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset (const allocator_type & __a) [inline], [explicit]
Allocator-extended default constructor.
๐ allocator-extended copy constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset (const multiset< _Key, _Compare, _Alloc > & __m, const __type_identity_t< allocator_type > & __a) [inline]
Allocator-extended copy constructor.
๐ allocator-extended move constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset (multiset< _Key, _Compare, _Alloc > && __m, const __type_identity_t< allocator_type > & __a) [inline], [noexcept]
Allocator-extended move constructor.
๐ allocator-extended initializer-list constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::multiset (initializer_list< value_type > __l, const allocator_type & __a) [inline]
Allocator-extended initialier-list constructor. (yes, โinitialierโ is literally how itโs written here, bestie, weโre keeping it ๐)
๐ฆ allocator-extended range constructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _InputIterator > std::multiset< _Key, _Compare, _Alloc >::multiset (_InputIterator __first, _InputIterator __last, const allocator_type & __a) [inline]
Allocator-extended range constructor.
๐ destructor
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> std::multiset< _Key, _Compare, _Alloc >::~multiset () [default]
The dtor only erases the elements, and note that if the elements themselves are pointers, the pointed-to memory is not touched in any way. Managing the pointer is the user's responsibility. read that again bestie, itโs important ๐
โจ Member Function Documentation โจ
okay so now the actual member functions. every overload, every return, every โhintโ note, all of it. letโs go ๐ซถ
๐ begin () const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> iterator std::multiset< _Key, _Compare, _Alloc >::begin () const [inline], [noexcept]
Returns a read-only (constant) iterator that points to the first element in the multiset. Iteration is done in ascending order according to the keys.
๐ cbegin () const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> iterator std::multiset< _Key, _Compare, _Alloc >::cbegin () const [inline], [noexcept]
Returns a read-only (constant) iterator that points to the first element in the multiset. Iteration is done in ascending order according to the keys.
๐ฆ cend () const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> iterator std::multiset< _Key, _Compare, _Alloc >::cend () const [inline], [noexcept]
Returns a read-only (constant) iterator that points one past the last element in the multiset. Iteration is done in ascending order according to the keys.
๐งน clear ()
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> void std::multiset< _Key, _Compare, _Alloc >::clear () [inline], [noexcept]
Erases all elements in a multiset. Note that this function only erases the elements, and that if the elements themselves are pointers, the pointed-to memory is not touched in any way. Managing the pointer is the user's responsibility.
๐ contains (const _Kt & __x) const โ template overload
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _Kt > auto std::multiset< _Key, _Compare, _Alloc >::contains (const _Kt & __x) const -> decltype(_M_t._M_find_tr(__x), void(), true) [inline]"
Finds whether an element with the given key exists.
Parameters
__xโ Key of elements to be located.
Returns
True if there is any element with the specified key.
๐ contains (const key_type & __x) const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> bool std::multiset< _Key, _Compare, _Alloc >::contains (const key_type & __x) const [inline]
Finds whether an element with the given key exists.
Parameters
__xโ Key of elements to be located.
Returns
True if there is any element with the specified key.
๐งฎ count (const _Kt & __x) const โ template overload
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _Kt > auto std::multiset< _Key, _Compare, _Alloc >::count (const _Kt & __x) const -> decltype(_M_t._M_count_tr(__x)) [inline]"
Finds the number of elements with given key.
Parameters
__xโ Key of elements to be located.
Returns
Number of elements with specified key.
๐ข count (const key_type & __x) const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> size_type std::multiset< _Key, _Compare, _Alloc >::count (const key_type & __x) const [inline]
Finds the number of elements with given key.
Parameters
__xโ Key of elements to be located.
Returns
Number of elements with specified key.
๐ crbegin () const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> reverse_iterator std::multiset< _Key, _Compare, _Alloc >::crbegin () const [inline], [noexcept]
Returns a read-only (constant) reverse iterator that points to the last element in the multiset. Iteration is done in descending order according to the keys.
๐ crend () const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> reverse_iterator std::multiset< _Key, _Compare, _Alloc >::crend () const [inline], [noexcept]
Returns a read-only (constant) reverse iterator that points to the last element in the multiset. Iteration is done in descending order according to the keys.
๐ ๏ธ emplace (_Args &&... __args)
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename... _Args> iterator std::multiset< _Key, _Compare, _Alloc >::emplace (_Args &&... __args) [inline]
Builds and inserts an element into the multiset.
Parameters
__argsโ Arguments used to generate the element instance to be inserted.
Returns
An iterator that points to the inserted element.
This function inserts an element into the multiset. Contrary to a std::set the multiset does not rely on unique keys and thus multiple copies of the same element can be inserted.
Insertion requires logarithmic time.
๐ช emplace_hint (const_iterator __pos, _Args &&... __args)
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename... _Args> iterator std::multiset< _Key, _Compare, _Alloc >::emplace_hint (const_iterator __pos, _Args &&... __args) [inline]
Builds and inserts an element into the multiset.
Parameters
__posโ An iterator that serves as a hint as to where the element should be inserted.__argsโ Arguments used to generate the element instance to be inserted.
Returns
An iterator that points to the inserted element.
This function inserts an element into the multiset. Contrary to a std::set the multiset does not rely on unique keys and thus multiple copies of the same element can be inserted.
Note that the first parameter is only a hint and can potentially improve the performance of the insertion process. A bad hint would cause no gains in efficiency.
See https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints for more on hinting.
Insertion requires logarithmic time (if the hint is not taken).
๐ซง empty () const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> bool std::multiset< _Key, _Compare, _Alloc >::empty () const [inline], [noexcept]
Returns true if the set is empty.
๐ end() โ the finish line, but make it constant
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
iterator std::multiset<_Key, _Compare, _Alloc>::end() const [inline], [noexcept]
Returns a read-only (constant) iterator that points one past the last element in the multiset. Like, it's not on an element, it's the little "you've gone too far" marker after the last one bestie ๐
Iteration is done in ascending order according to the keys. So the whole thing walks up, up, up โฌ๏ธโจ
Referenced by std::multiset<_Key, _Compare, _Alloc>::extract().
๐ equal_range() โ the fancy-relational overloads
Four of these bad boys, all living their best life. Same energy, different flavors ๐
Overload one โ the _Kt non-const one:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
template<typename _Kt>
auto std::multiset<_Key, _Compare, _Alloc>::equal_range(const _Kt& __x)
-> decltype(pair<iterator, iterator>(_M_t._M_equal_range_tr(__x)))
[inline]
Overload two โ the _Kt const one:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
template<typename _Kt>
auto std::multiset<_Key, _Compare, _Alloc>::equal_range(const _Kt& __x) const
-> decltype(pair<iterator, iterator>(_M_t._M_equal_range_tr(__x)))
[inline]
Overload three โ the key_type one:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
std::pair<iterator, iterator>
std::multiset<_Key, _Compare, _Alloc>::equal_range(const key_type& __x) [inline]
Overload four โ the key_type const one:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
std::pair<const_iterator, const_iterator>
std::multiset<_Key, _Compare, _Alloc>::equal_range(const key_type& __x) const
[inline]
Okay and here's what all four of them actually do: finds a subsequence matching given key. Like, the whole little clique of duplicates that share that key ๐ฏโโ๏ธ
Parameters
__xโ Key to be located.
Returns
Pair of iterators that possibly points to the subsequence matching given key. Two-for-one deal, no cap ๐
This function is equivalent to
std::make_pair(c.lower_bound(val),
c.upper_bound(val))
(but is faster than making the calls separately). So like, same result but it's giving efficiency โจ
This function probably only makes sense for multisets. Because lol, a regular set doesn't have duplicates, so there's no "subsequence" to find โ it's giving one-element range energy ๐
๐งน erase() โ the three flavors of goodbye
Overload one โ bye by key:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
size_type std::multiset<_Key, _Compare, _Alloc>::erase(const key_type& __x) [inline]
Erases elements according to the provided key.
Parameters
__xโ Key of element to be erased.
Returns
The number of elements erased.
This function erases all elements located by the given key from a multiset. Not one, bestie โ all of them, every single duplicate, gone, periodt ๐ซถ
โ ๏ธ Heads up: note that this function only erases the element, and that if the element is itself a pointer, the pointed-to memory is not touched in any way. Managing the pointer is the user's responsibility. So likeโฆ if you leak, that's on you, not on us ๐
Overload two โ bye by range:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
_GLIBCXX_ABI_TAG_CXX11
iterator std::multiset<_Key, _Compare, _Alloc>::erase(const_iterator __first,
const_iterator __last) [inline]
Erases a [first,last) range of elements from a multiset. Slicing out a whole chunk, iconic โ๏ธ
Parameters
__firstโ Iterator pointing to the start of the range to be erased.__lastโ Iterator pointing to the end of the range to be erased.
Returns
The iterator last.
This function erases a sequence of elements from a multiset. Note that this function only erases the elements, and that if the elements themselves are pointers, the pointed-to memory is not touched in any way. Managing the pointer is the user's responsibility. Same deal as before โ the container does not clean up your pointees for you, ngl that's a you problem ๐
Overload three โ bye by position:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
_GLIBCXX_ABI_TAG_CXX11
iterator std::multiset<_Key, _Compare, _Alloc>::erase(const_iterator __position) [inline]
Erases an element from a multiset. Just the one. Single-target elimination ๐ฏ
Parameters
__positionโ An iterator pointing to the element to be erased.
Returns
An iterator pointing to the element immediately following position prior to the element being erased. If no such element exists, end() is returned.
This function erases an element, pointed to by the given iterator, from a multiset. Note that this function only erases the element, and that if the element is itself a pointer, the pointed-to memory is not touched in any way. Managing the pointer is the user's responsibility. Yeah yeah, same warning, it's important though ๐ซถ
๐ช extract() โ pluck a whole node out
Overload one โ by key:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
node_type std::multiset<_Key, _Compare, _Alloc>::extract(const key_type& __x) [inline]
Extract a node.
Overload two โ by iterator position:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
node_type std::multiset<_Key, _Compare, _Alloc>::extract(const_iterator __pos) [inline]
Extract a node.
References std::multiset<_Key, _Compare, _Alloc>::end().
Like, you're literally pulling the node out of the tree and holding it in your hand. No copy, no allocation, just vibes ๐ฅ
๐ find() โ where is she
Four overloads, all doing the same scavenger hunt, just const-flavored differently ๐ฆ
Overload one โ _Kt:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
template<typename _Kt>
auto std::multiset<_Key, _Compare, _Alloc>::find(const _Kt& __x)
-> decltype(iterator{_M_t._M_find_tr(__x)})
[inline]
Overload two โ _Kt const:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
template<typename _Kt>
auto std::multiset<_Key, _Compare, _Alloc>::find(const _Kt& __x) const
-> decltype(const_iterator{_M_t._M_find_tr(__x)})
[inline]
Overload three โ key_type:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
iterator std::multiset<_Key, _Compare, _Alloc>::find(const key_type& __x) [inline]
Overload four โ key_type const:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
const_iterator std::multiset<_Key, _Compare, _Alloc>::find(const key_type& __x) const [inline]
All four: tries to locate an element in a set. Shoelace-hunt energy ๐
Parameters
__xโ Element to be located.
Returns
Iterator pointing to sought-after element, or end() if not found. So if she's not there, you get the past-the-end marker and you know it's a wrap ๐ญ
This function takes a key and tries to locate the element with which the key matches. If successful the function returns an iterator pointing to the sought after element. If unsuccessful it returns the past-the-end (end()) iterator.
Lowkey important: with a multiset,find()gives you one of the matching elements โ the doc doesn't promise which one โ so if you need all of them, that's anequal_range()situation bestie ๐
๐งพ get_allocator() โ who's holding the bag
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
allocator_type std::multiset<_Key, _Compare, _Alloc>::get_allocator() const [inline], [noexcept]
Returns the memory allocation object. That's it. That's the whole thing. Your allocator, back in your hands ๐
๐งท insert() โ put it in, put it in
Overload one โ the range insert:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
template<typename _InputIterator>
void std::multiset<_Key, _Compare, _Alloc>::insert(_InputIterator __first,
_InputIterator __last) [inline]
A template function that tries to insert a range of elements. Bulk add, no cap ๐ซถ
Parameters
__firstโ Iterator pointing to the start of the range to be inserted.__lastโ Iterator pointing to the end of the range.
Complexity similar to that of the range constructor. No new surprises, same cost as the constructor flavor โจ
Overload two โ the single value one:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
iterator std::multiset<_Key, _Compare, _Alloc>::insert(const value_type& __x) [inline]
Inserts an element into the multiset.
Parameters
__xโ Element to be inserted.
Returns
An iterator that points to the inserted element.
This function inserts an element into the multiset. Contrary to a std::set the multiset does not rely on unique keys and thus multiple copies of the same element can be inserted. Duplicates welcome, babe. Not like that other container that's all "nooo only one of each" ๐
Insertion requires logarithmic time.
Referenced by std::multiset<_Key, _Compare, _Alloc>::insert().
Overload three โ re-insert an extracted node:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
iterator std::multiset<_Key, _Compare, _Alloc>::insert(const_iterator __hint,
node_type&& __nh) [inline]
Re-insert an extracted node. You took her out with extract(), now put her back โ glow-up-and-return arc ๐ฆ
References std::move().
Overload four โ hinted insert:
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key>>
iterator std::multiset<_Key, _Compare, _Alloc>::insert(const_iterator __position,
const value_type& __x) [inline]
Inserts an element into the multiset.
Parameters
__positionโ An iterator that serves as a hint as to where the element should be inserted.__xโ Element to be inserted.
Returns
An iterator that points to the inserted element.
This function inserts an element into the multiset. Contrary to a std::set the multiset does not rely on unique keys and thus multiple copies of the same element can be inserted. Yeah, say it again for the people in the back โ duplicates are always legal here ๐
And the hint? It's just a hint, bestie. It's not a command, it's a suggestion, the container will do what it wants ๐
okay so picking up right where we left off with the hint-y insert ๐ โ
real talk: the first parameter is only a hint. it can potentially improve the performance of the insertion process, but a bad hint would cause no gains in efficiency. none. zero. ๐
peep the docs at https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints for more on hinting, and remember: insertion requires logarithmic time (if the hint is not taken).
๐ insert โ the initializer_list glow-up
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> void std::multiset< _Key, _Compare, _Alloc >::insert (initializer_list< value_type > __l) [inline]
Attempts to insert a whole list of elements into the multiset, bestie. like, all at once โจ
Parameters
__lโ astd::initializer_list<value_type>of elements to be inserted.
Complexity? similar to that of the range constructor, ngl.
References std::multiset< _Key, _Compare, _Alloc >::insert().
๐ฆ insert โ re-inserting an extracted node
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> iterator std::multiset< _Key, _Compare, _Alloc >::insert (node_type && __nh) [inline]
Re-insert an extracted node ๐ โ giving that node its main character comeback arc.
References std::move().
๐
key_comp
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> key_compare std::multiset< _Key, _Compare, _Alloc >::key_comp () const [inline]
Returns the comparison object. that's it. that's the function ๐ซถ
๐ lower_bound โ the _Kt transparent overload (non-const)
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _Kt > auto std::multiset< _Key, _Compare, _Alloc >::lower_bound (const _Kt & __x) -> decltype(iterator(_M_t._M_lower_bound_tr(__x)))
[inline]"
Finds the beginning of a subsequence matching given key ๐ฅ
Parameters
__xโ key to be located.
Returns โ iterator pointing to first element equal to or greater than key, or end().
This function returns the first element of a subsequence of elements that matches the given key. If unsuccessful it returns an iterator pointing to the first element that has a greater value than given key, or end() if no such element exists. lowkey so specific and we love that for it ๐
๐ lower_bound โ the _Kt transparent overload (const)
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _Kt > auto std::multiset< _Key, _Compare, _Alloc >::lower_bound (const _Kt & __x) const -> decltype(iterator(_M_t._M_lower_bound_tr(__x)))
[inline]"
Finds the beginning of a subsequence matching given key โ const edition, same energy ๐ธ
Parameters
__xโ key to be located.
Returns โ iterator pointing to first element equal to or greater than key, or end().
This function returns the first element of a subsequence of elements that matches the given key. If unsuccessful it returns an iterator pointing to the first element that has a greater value than given key, or end() if no such element exists.
๐ lower_bound โ the key_type overload
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> iterator std::multiset< _Key, _Compare, _Alloc >::lower_bound (const key_type & __x) [inline]
Finds the beginning of a subsequence matching given key ๐
Parameters
__xโ key to be located.
Returns โ iterator pointing to first element equal to or greater than key, or end().
This function returns the first element of a subsequence of elements that matches the given key. If unsuccessful it returns an iterator pointing to the first element that has a greater value than given key, or end() if no such element exists.
๐ lower_bound โ the key_type overload, but const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> const_iterator std::multiset< _Key, _Compare, _Alloc >::lower_bound (const key_type & __x) const [inline]
Finds the beginning of a subsequence matching given key. yes, again. four overloads, four moods, they all ate ๐
Parameters
__xโ key to be located.
Returns โ iterator pointing to first element equal to or greater than key, or end().
This function returns the first element of a subsequence of elements that matches the given key. If unsuccessful it returns an iterator pointing to the first element that has a greater value than given key, or end() if no such element exists.
๐ max_size
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> size_type std::multiset< _Key, _Compare, _Alloc >::max_size () const [inline], [noexcept]
Returns the maximum size of the set. the ceiling. the limit. the "how big can she get" ๐
๐ operator= โ copy assignment
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> multiset & std::multiset< _Key, _Compare, _Alloc >::operator= (const multiset< _Key, _Compare, _Alloc > &) [default]
Multiset assignment operator ๐ซถ whether the allocator is copied depends on the allocator traits โ so it's giving "it depends", iykyk.
๐ operator= โ the initializer_list one
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> multiset & std::multiset< _Key, _Compare, _Alloc >::operator= (initializer_list< value_type > __l) [inline]
Multiset list assignment operator โจ
Parameters
__lโ aninitializer_list.
This function fills a multiset with copies of the elements in the initializer list __l.
heads up bestie: the assignment completely changes the multiset, and the resulting multiset's size is the same as the number of elements assigned. no leftovers, periodt ๐
๐ operator= โ move assignment
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> multiset & std::multiset< _Key, _Compare, _Alloc >::operator= (multiset< _Key, _Compare, _Alloc > &&) [default]
Move assignment operator ๐ฅ she's moving, she's thriving.
๐ rbegin
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> reverse_iterator std::multiset< _Key, _Compare, _Alloc >::rbegin () const [inline], [noexcept]
Returns a read-only (constant) reverse iterator that points to the last element in the multiset. Iteration is done in descending order according to the keys โ backwards walk, main character energy ๐
๐ rend
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> reverse_iterator std::multiset< _Key, _Compare, _Alloc >::rend () const [inline], [noexcept]
Returns a read-only (constant) reverse iterator that points to the last element in the multiset. Iteration is done in descending order according to the keys. (yes, the wording matches rbegin exactly โ the docs said what they said, and we respect it ๐)
๐ size
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> size_type std::multiset< _Key, _Compare, _Alloc >::size () const [inline], [noexcept]
Returns the size of the set. how many besties are in the building ๐ฆ
๐ swap
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> void std::multiset< _Key, _Compare, _Alloc >::swap (multiset< _Key, _Compare, _Alloc > & __x) [inline], [noexcept]
Swaps data with another multiset ๐ซ
Parameters
__xโ a multiset of the same element and allocator types.
This exchanges the elements between two multisets in constant time. (It is only swapping a pointer, an integer, and an instance of the Compare type (which itself is often stateless and empty), so it should be quite fast.) Note that the global std::swap() function is specialized such that std::swap(s1,s2) will feed to this function. iconic โจ
Whether the allocators are swapped depends on the allocator traits.
๐ upper_bound โ _Kt transparent overload (non-const)
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _Kt > auto std::multiset< _Key, _Compare, _Alloc >::upper_bound (const _Kt & __x) -> decltype(iterator(_M_t._M_upper_bound_tr(__x)))
[inline]"
Finds the end of a subsequence matching given key ๐ธ
Parameters
__xโ key to be located.
Returns โ iterator pointing to the first element greater than key, or end().
๐ upper_bound โ _Kt transparent overload (const)
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> template<typename _Kt > auto std::multiset< _Key, _Compare, _Alloc >::upper_bound (const _Kt & __x) const -> decltype(iterator(_M_t._M_upper_bound_tr(__x)))
[inline]"
Finds the end of a subsequence matching given key, const flavour ๐
Parameters
__xโ key to be located.
Returns โ iterator pointing to the first element greater than key, or end().
๐ upper_bound โ key_type overload
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> iterator std::multiset< _Key, _Compare, _Alloc >::upper_bound (const key_type & __x) [inline]
Finds the end of a subsequence matching given key ๐
Parameters
__xโ key to be located.
Returns โ iterator pointing to the first element greater than key, or end().
๐ upper_bound โ key_type overload, const
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> const_iterator std::multiset< _Key, _Compare, _Alloc >::upper_bound (const key_type & __x) const [inline]
Finds the end of a subsequence matching given key. last one, we made it ๐ญ
Parameters
__xโ key to be located.
Returns โ iterator pointing to the first element greater than key, or end().
๐ value_comp
template<typename _Key , typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<_Key>> value_compare std::multiset< _Key, _Compare, _Alloc >::value_comp () const [inline]
Returns the comparison object. twin of key_comp, different vibe, same job ๐ซถ
๐ Author ๐
Generated automatically by Doxygen for libstdc++ from the source code. not a human, just a robot doing its little documentation dance ๐คโจ
aaaand that's the whole page bestie, we're done, go touch grass ๐ฑ๐
the footer on this one is the libstdc++ std::multiset<...> man page tagged (3cxx) โ that's the source/version situation, straight from Doxygen's auto-generated output, so no date drama to report, just vibes. mwah ๐๐๐ฆ
๐ฆ where this page comes from
- ubuntu noble: libstdc++-14-doc 14-20240412-0ubuntu1
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms