std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::unordered_map
: unordered_map(size_type(/* unspecified */)) {}
(until C++20)
const Hash& hash = Hash(),
const key_equal& equal = key_equal(),
const Allocator& alloc )
const Hash& hash,
const Allocator& alloc )
unordered_map( InputIt first, InputIt last,
size_type bucket_count = /* unspecified */,
const Hash& hash = Hash(),
const key_equal& equal = key_equal(),
unordered_map( InputIt first, InputIt last,
size_type bucket_count,
const Allocator& alloc )
: unordered_map(first, last,
unordered_map( InputIt first, InputIt last,
size_type bucket_count,
const Hash& hash,
const Allocator& alloc )
: unordered_map(first, last,
size_type bucket_count = /* unspecified */,
const Hash& hash = Hash(),
const key_equal& equal = key_equal(),
size_type bucket_count,
const Allocator& alloc )
: unordered_map(init, bucket_count,
size_type bucket_count,
const Hash& hash,
const Allocator& alloc )
: unordered_map(init, bucket_count,
unordered_map( std::from_range_t, R&& rg,
size_type bucket_count = /* see description */,
const Hash& hash = Hash(),
const key_equal& equal = key_equal(),
unordered_map( std::from_range_t, R&& rg,
size_type bucket_count,
const Allocator& alloc )
: unordered_map(std::from_range, std::forward <R>(rg),
unordered_map( std::from_range_t, R&& rg,
size_type bucket_count,
const Hash& hash,
const Alloc& alloc )
: unordered_map(std::from_range, std::forward <R>(rg),
Constructs new container from a variety of data sources. Optionally uses user supplied bucket_count as a minimal number of buckets to create, hash as the hash function, equal as the function to compare keys and alloc as the allocator.
[
first,
last)
. Sets max_load_factor() to 1.0. If multiple elements in the range have keys that compare equivalent, it is unspecified which element is inserted (pending LWG2844).The template parameter Allocator
is only deduced from the first argument while used in class template argument deduction.
The template parameter Allocator
is only deduced from the first argument while used in class template argument deduction.
[edit] Parameters
input_range
whose elements are convertible to value_type
InputIt
must meet the requirements of LegacyInputIterator.
[edit] Complexity
[edit] Exceptions
Calls to Allocator::allocate
may throw.
[edit] Notes
After container move construction (overload (11,12)), references, pointers, and iterators (other than the end iterator) to other remain valid, but refer to elements that are now in *this. The current standard makes this guarantee via the blanket statement in [container.reqmts]/67, and a more direct guarantee is under consideration via LWG issue 2321.Although not formally required until C++23, some implementations have already put the template parameter Allocator
into non-deduced contexts in earlier modes.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | Ranges-aware construction and insertion; overloads (16-18) |
[edit] Example
#include <bitset> #include <string> #include <unordered_map> #include <utility> #include <vector> struct Key { std::string first; std::string second; }; struct KeyHash { std::size_t operator()(const Key& k) const { return std::hash <std::string >()(k.first) ^ (std::hash <std::string >()(k.second) << 1); } }; struct KeyEqual { bool operator()(const Key& lhs, const Key& rhs) const { return lhs.first == rhs.first && lhs.second == rhs.second; } }; struct Foo { Foo(int val_) : val(val_) {} int val; bool operator==(const Foo &rhs) const { return val == rhs.val; } }; template<> struct std::hash <Foo> { std::size_t operator()(const Foo &f) const { return std::hash <int>{}(f.val); } }; int main() { // default constructor: empty map std::unordered_map <std::string, std::string > m1; // list constructor std::unordered_map <int, std::string > m2 = { {1, "foo"}, {3, "bar"}, {2, "baz"} }; // copy constructor std::unordered_map <int, std::string > m3 = m2; // move constructor std::unordered_map <int, std::string > m4 = std::move(m2); // range constructor std::vector <std::pair <std::bitset <8>, int>> v = {{0x12, 1}, {0x01,-1}}; std::unordered_map <std::bitset <8>, double> m5(v.begin(), v.end()); // Option 1 for a constructor with a custom Key type // Define the KeyHash and KeyEqual structs and use them in the template std::unordered_map <Key, std::string, KeyHash, KeyEqual> m6 = { {{"John", "Doe"}, "example"}, {{"Mary", "Sue"}, "another"} }; // Option 2 for a constructor with a custom Key type. // Define a const == operator for the class/struct and specialize std::hash // structure in the std namespace std::unordered_map <Foo, std::string > m7 = { {Foo(1), "One"}, {2, "Two"}, {3, "Three"} }; // Option 3: Use lambdas // Note that the initial bucket count has to be passed to the constructor struct Goo { int val; }; auto hash = [](const Goo &g){ return std::hash <int>{}(g.val); }; auto comp = [](const Goo &l, const Goo &r){ return l.val == r.val; }; std::unordered_map <Goo, double, decltype(hash), decltype(comp)> m8(10, hash, comp); }
[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 2193 | C++11 | the default constructor (1) was explicit | made non-explicit |
LWG 2230 | C++11 | the semantics of overload (13) was not specified | specified |