std::unordered_set
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_set
meets the requirements of Container, AllocatorAwareContainer, UnorderedAssociativeContainer.
std::unordered_set
are constexpr: it is possible to create and use std::unordered_set
objects in the evaluation of a constant expression.
However, std::unordered_set
objects generally cannot be constexpr, because any dynamically allocated storage must be released in the same evaluation of constant expression.
key_type
Key
[edit] value_type
Key
[edit] size_type
Unsigned integer type (usually std::size_t)[edit] difference_type
Signed integer type (usually std::ptrdiff_t)[edit] hasher
Hash
[edit] key_equal
KeyEqual
[edit] allocator_type
Allocator
[edit] reference
value_type&[edit] const_reference
const value_type&[edit] pointer
std::allocator_traits<Allocator>::pointer[edit] const_pointer
std::allocator_traits<Allocator>::const_pointer[edit] iterator
Constant LegacyForwardIterator and ConstexprIterator(since C++26) to value_type
[edit] const_iterator
LegacyForwardIterator and ConstexprIterator(since C++26) to const value_type[edit] local_iterator
An iterator type whose category, value, difference, pointer and
iterator
. This iterator
const_local_iterator
An iterator type whose category, value, difference, pointer and
const_iterator
. This iterator
node_type
(since C++17) a specialization of node handle representing a container node[edit] insert_return_type
(since C++17) type describing the result of inserting a node_type
, a specialization of
template<class Iter, class NodeType>
struct /*unspecified*/
{
Iter position;
bool inserted;
NodeType node;
};
instantiated with template arguments iterator
and node_type
.[edit]
unordered_set
unordered_set
The member types iterator
and const_iterator
may be aliases to the same type. This means defining a pair of function overloads using the two types as parameter types may violate the One Definition Rule. Since iterator
is convertible to const_iterator
, a single function with a const_iterator
as parameter type will work instead.
#include <iostream> #include <unordered_set> void print(const auto& set) { for (const auto& elem : set) std::cout << elem << ' '; std::cout << '\n'; } int main() { std::unordered_set<int> mySet{2, 7, 1, 8, 2, 8}; // creates a set of ints print(mySet); mySet.insert(5); // puts an element 5 in the set print(mySet); if (auto iter = mySet.find(5); iter != mySet.end()) mySet.erase(iter); // removes an element pointed to by iter print(mySet); mySet.erase(7); // removes an element 7 print(mySet); }
Possible output:
8 1 7 2 5 8 1 7 2 8 1 7 2 8 1 2[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior LWG 2050 C++11 the definitions ofreference
, const_reference
, pointer
const_pointer
were based on allocator_type
based on value_type
and
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4