Note, this article is not finished! You can help by editing this doc page.
Overview
- Simplified (since C++98)
- Detailed
template< class Key, /* ... */ >
class unorderd_multiset;
- Regular (since C++98)
- Polymorphic (since C++17)
template<
class Key,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
class Allocator = std::allocator<Key>
>
class unordered_multiset;
namespace pmr {
template <class Key,
class Hash = std::hash<Key>,
class Pred = std::equal_to<Key>>
using unordered_multiset = std::unordered_multiset<Key, Hash, Pred,
std::pmr::polymorphic_allocator<Key>>
}
The std::unordered_multiset is an unordered associative container for storing unique objects.
Technical details
Technical definition of an unordered_multiset
std::unordered_multiset is an associative container that contains a set of unique objects of type Key.
Search, insertion, and removal have average constant-time complexity.
Internally, the elements are not sorted in any particular order, but organized into buckets. Which bucket an element is placed into depends entirely on the hash of its value. This allows fast access to individual elements, since once a hash is computed, it refers to the exact bucket the element is placed into.
Container elements may not be modified (even by non const iterators) since modification could change an element's hash and corrupt the container.
std::unordered_multiset meets the requirements of Container, AllocatorAwareContainer,
UnorderedAssociativeContainer.
std::unordered_multiset
| Defined in | unordered_set |
Template parameters
| pub | Key | The type of the stored keys. |
| pub | Hash | A function object that perfoms hashing on two objects of type |
| pub | Compare | A comparator type satisfying Compare. |
| pub | Allocator | An allocator type responsible for allocating and deallocating memory. Must satisfy Allocator. |
Type names
| pub | key_type | Key |
| pub | value_type | Key |
| pub | size_type | Unsigned integer type (usually |
| pub | difference_type | Signed integer type (usually |
| pub | hasher | Hash |
| pub | key_equal | KeyEqual |
| pub | allocator_type | Allocator |
| pub | reference | value_type& |
| pub | const_reference | const value_type& |
| pub | pointer | std::allocator_traits<Allocator>::pointer |
| pub | const_pointer | std::allocator_traits<Allocator>::const_pointer |
| pub | iterator ❗ | Constant LegacyBidirectionalIterator to |
| pub | const_iterator ❗ | LegacyBidirectionalIterator to |
| pub | local_iterator | Like |
| pub | const_local_iterator | Like |
| pub | node_type (since C++17) | A specialization of node handle representing a container node. |
Unordered multiset's iterators
iterator is said to be constant because it is impossible to modify the values it's pointing to.
This is because modyfing a value the iterator is pointing to could possibly invalidate the internal structure of the unordered multiset,
which could then lead to all kinds of incorrect and unexpected behaviours.
The member type aliases iterator and const_iterator may be the same.
This is left entirely to the implementation.
This means that any overloaded functions/specializations differing only in the iterator types may be incorrect and may lead to ODR violation.
Member functions
| pub | (constructor) | Constructs a new unordered set. |
| pub | (destructor) | Destructs an unordered set. |
| pub | operator= | Assigns one unordered set to another. |
| pub | get_allocator | Returns an associated allocator. |
Iterators
| pub | begin cbegin | Returns an iterator to the beginning. |
| pub | end cend | Returns an iterator to the end. |
Capacity
| pub | empty | Returns |
| pub | size | Returns the number of elements in an unordered set. |
| pub | max_size | Returns the maximum possible number of elements. |
Modifiers
| pub | clear | Clears the contents of an unordered set. |
| pub | insert | Inserts elements (or nodes (extracted with |
| pub | emplace | Constructs a new element in place. |
| pub | emplace_hint | Constructs elements in-place using a hint (iterator). |
| pub | erase | Erases elements. |
| pub | swap | Swaps two unordered sets. |
| pub | extract (since C++17) | Extracts nodes from an unordered set (can be later inserted somewhere else). |
| pub | merge (since C++17) | Merges two unordered sets together. |
Lookup
| pub | count | Returns the number of elements matching a specific key. |
| pub | find | Searches for an element and returns an iterator to it, or an end iterator if not found. |
| pub | contains (since C++20) | Returns |
| pub | equal_range | Returns a range of elements matching a specific key. |
Bucket interface
| pub | begin (size_type) cbegin (size_type) | Returns an iterator to the beginning of a specified bucket. |
| pub | end (size_type) cend (size_type) | Returns an iterator to the end of a specified bucket. |
| pub | bucket_count | Returns a number of buckets. |
| pub | max_bucket_count | Returns a maximum number of buckets. |
| pub | bucket_size | Returns a number of elements in a specific bucket. |
| pub | bucket | Returns a bucket for a specific key. |
Hash policy
| pub | load_factor | Returns an average number of elements per bucket. |
| pub | max_load_factor | Manages a maximum average number of elements per bucket. |
| pub | rehash | Reserves at least the specified number of buckets and regenerates the hash table. |
| pub | reserve | Reserves space for at least a specified number of elements and regenerates the hash table. |
Observers
| pub | hash_function | Returns an internal function object that hashes keys. |
| pub | key_eq | Returns an internal function object that compares keys. |
Non-member functions
| pub | operator== operator!= (removed in C++20) | Compares values in an unordered_map. |
| pub | std::swap (std::unordered_multiset) | An overload for a std::swap algorithm. |
| pub | std::erase_if (std::unordered_multiset) (since C++20) | Overload for a std::erase_if algorithm. |
Deduction guides (since C++17)
Click to expand
Deduction guides
// (1)
template< class InputIt, class Alloc >
unordered_multiset( InputIt, InputIt, Alloc )
-> unordered_multiset<iter_key_t<InputIt>, iter_val_t<InputIt>,
std::hash<iter_key_t<InputIt>>,
std::equal_to<iter_key_t<InputIt>>, Alloc>;
// (2)
template< class InputIt, class Hash, class Alloc >
unordered_multiset( InputIt, InputIt, typename /*see below*/::size_type, Hash, Alloc )
-> unordered_multiset<iter_key_t<InputIt>, iter_val_t<InputIt>, Hash,
std::equal_to<iter_key_t<InputIt>>, Alloc>;
// (3)
template< class InputIt, class Alloc >
unordered_multiset( InputIt, InputIt, typename /*see below*/::size_type, Alloc )
-> unordered_multiset<iter_key_t<InputIt>, iter_val_t<InputIt>,
std::hash<iter_key_t<InputIt>>,
std::equal_to<iter_key_t<InputIt>>, Alloc>;
// (4)
template< class InputIt,
class Hash = std::hash<iter_key_t<InputIt>>,
class Pred = std::equal_to<iter_key_t<InputIt>>,
class Alloc = std::allocator<iter_to_alloc_t<InputIt>>>
unordered_multiset( InputIt, InputIt,
typename /*see below*/::size_type = /*see below*/,
Hash = Hash(), Pred = Pred(), Alloc = Alloc() )
-> unordered_multiset<iter_key_t<InputIt>, iter_val_t<InputIt>, Hash, Pred, Alloc>;
(1 - 4)allow deduction from an iterator range
// (5)
template< class Key, class T, typename Alloc >
unordered_multiset( std::initializer_list<std::pair<Key, T>>, Alloc )
-> unordered_multiset<Key, T, std::hash<Key>, std::equal_to<Key>, Alloc>;
// (6)
template< class Key, class T, class Hash, class Alloc >
unordered_multiset( std::initializer_list<std::pair<Key, T>>,
typename /*see below*/::size_type, Hash, Alloc )
-> unordered_multiset<Key, T, Hash, std::equal_to<Key>, Alloc>;
// (7)
template< class Key, class T, typename Alloc >
unordered_multiset( std::initializer_list<std::pair<Key, T>>,
typename /*see below*/::size_type, Alloc )
-> unordered_multiset<Key, T, std::hash<Key>, std::equal_to<Key>, Alloc>;
// (8)
template< class Key, class T, class Hash = std::hash<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<std::pair<const Key, T>> >
unordered_multiset( std::initializer_list<std::pair<Key, T>>,
typename /*see below*/::size_type = /*see below*/,
Hash = Hash(), Pred = Pred(), Alloc = Alloc() )
-> unordered_multiset<Key, T, Hash, Pred, Alloc>;
(5 - 8)allow deduction from astd::initializer_list
Aliases iter_key_t, iter_val_t and iter_to_alloc_t are defined as if follows:
template< class InputIt >
using iter_key_t = std::remove_const_t<
typename std::iterator_traits<InputIt>::value_type::first_type>;
template< class InputIt >
using iter_val_t = typename std::iterator_traits<InputIt>::value_type::second_type;
template< class InputIt >
using iter_to_alloc_t = std::pair<
std::add_const_t<typename std::iterator_traits<InputIt>::value_type::first_type>,
typename std::iterator_traits<InputIt>::value_type::second_type
>
Note that these aliases aren't guaranteed to be found anywhere in the standard library. They are defined solely for presentation purposes of these deduction guides and weren't present in the standard library at the point of writing of this document.
Overload resolution
In order for any of the deduction guides to participate in overload resolution, the folllowing requirements must be met:
InputItsatisfiesLegacyInputIteratorAllocsatisfiesAllocatorHashdoesn't deduce to an integral type or doesn't satisfyAllocatorPreddoesn't satisfyAllocator
The extent to which the library determines that a type does not satisfy LegacyInputIterator is unspecified,
except that as a minimum:
- Integral types do not qualify as input iterators.
Likewise, the extent to which it determines that a type does not satisfy Allocator is unspecified,
except that as a minimum:
- The member type
Alloc::value_typemust exist. - The expression
std::declval<Alloc&>().allocate(std::size_t{})must be well-formed when treated as an unevaluated operand.
Hover to see the original license.