std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::unordered_map
unordered_map() : unordered_map( size_type(/*definido por la implementación*/) ) {} explicit unordered_map( size_type bucket_count, {{#pad:|22}} const Hash& hash = Hash(), {{#pad:|22}} const key_equal& equal = key_equal(), {{#pad:|22}} const Allocator& alloc = Allocator() ); |
(1) | (desde C++11) |
unordered_map( size_type bucket_count, {{#pad:|13}} const Allocator& alloc ) {{#pad:|13}} : unordered_map(bucket_count, Hash(), key_equal(), alloc) {} unordered_map( size_type bucket_count, {{#pad:|13}} const Hash& hash, {{#pad:|13}} const Allocator& alloc ) {{#pad:|13}} : unordered_map(bucket_count, hash, key_equal(), alloc) {} |
(1) | (desde C++14) |
explicit unordered_map( const Allocator& alloc ); |
(1) | (desde C++11) |
template< class InputIt > unordered_map( InputIt first, InputIt last, {{#pad:|13}} size_type bucket_count = /*definido por la implementación*/, {{#pad:|13}} const Hash& hash = Hash(), {{#pad:|13}} const key_equal& equal = key_equal(), {{#pad:|13}} const Allocator& alloc = Allocator() ); |
(2) | (desde C++11) |
template< class InputIt > unordered_map( InputIt first, InputIt last, {{#pad:|13}} size_type bucket_count, {{#pad:|13}} const Allocator& alloc ) {{#pad:|13}} : unordered_map(first, last, {{#pad:|17}} bucket_count, Hash(), key_equal(), alloc) {} |
(2) | (desde C++14) |
template< class InputIt > unordered_map( InputIt first, InputIt last, {{#pad:|13}} size_type bucket_count, {{#pad:|13}} const Hash& hash, {{#pad:|13}} const Allocator& alloc ) {{#pad:|13}} : unordered_map(first, last, {{#pad:|17}} bucket_count, hash, key_equal(), alloc) {} |
(2) | (desde C++14) |
unordered_map( const unordered_map& other ); |
(3) | (desde C++11) |
unordered_map( const unordered_map& other, const Allocator& alloc ); |
(3) | (desde C++11) |
unordered_map( unordered_map&& other ); |
(4) | (desde C++11) |
unordered_map( unordered_map&& other, const Allocator& alloc ); |
(4) | (desde C++11) |
unordered_map( std::initializer_list<value_type> init, {{#pad:|13}} size_type bucket_count = /*definido por la implementación*/, {{#pad:|13}} const Hash& hash = Hash(), {{#pad:|13}} const key_equal& equal = key_equal(), {{#pad:|13}} const Allocator& alloc = Allocator() ); |
(5) | (desde C++11) |
unordered_map( std::initializer_list<value_type> init, {{#pad:|13}} size_type bucket_count, {{#pad:|13}} const Allocator& alloc ) {{#pad:|13}} : unordered_map(init, bucket_count, {{#pad:|17}} Hash(), key_equal(), alloc) {} |
(5) | (desde C++14) |
unordered_map( std::initializer_list<value_type> init, {{#pad:|13}} size_type bucket_count, {{#pad:|13}} const Hash& hash, {{#pad:|13}} const Allocator& alloc ) {{#pad:|13}} : unordered_map(init, bucket_count, {{#pad:|17}} hash, key_equal(), alloc) {} |
(5) | (desde C++14) |
Construye un nuevo contenedor a partir de una variedad de fuentes de datos. Opcionalmente utiliza una cuenta de depósitos, bucket_count, suministrada por el usuario como el número mínimo de depósitos a crear, hash como la función de dispersión, equal como la función para comparar claves y alloc como el asignador de memoria.
max_load_factor() a 1.0. Para el constructor por defecto, el número de depósitos está definido por la implementación.[first, last). Establece max_load_factor() a 1.0. Si varios elementos en el rango tienen claves que se comparan equivalentes, no se especifica qué elemento se inserta (pendiente de la resolución de LWG2844).other, también copia el factor de carga, el predicado, y la función de dispersión. Si no se proporciona alloc, el asignador de memoria se obtiene llamando a std::allocator_traits<allocator_type>::select_on_container_copy_construction(other.get_allocator()).
|
El parámetro de plantilla |
(desde C++23) |
other usando la semántica de movimiento. Si no se proporciona alloc el asignador de memoria se obtiene mediante la construccón por movimiento del asignador que pertenece a other.
|
El parámetro de plantilla |
(desde C++23) |
init, lo mismo que unordered_map(init.begin(), init.end()).Parámetros
| alloc | - | Asignador de memoria a usar para todas las asignaciones de memoria de este contenedor. |
| bucket_count | - | Número mínimo de depósitos a usar en la inicialización. Si no se especifica, se usa el valor por defecto definido por la implementación. |
| hash | - | Función de dispersión a usar. |
| equal | - | Función de comparación a usar para todas las comparaciones de claves de este contenedor. |
| first, last | - | El rango del cual copiar los elementos. |
| other | - | Otro contenedor a usar como fuente con el cual inicializar los elementos del contenedor. |
| init | - | Lista de inicializadores con la cual inicializar los elementos del contenedor. |
| Requisitos de tipo | ||
-InputIt debe satisfacer los requisitos de InputIterator.
| ||
Complejidad
first y last.other.alloc y alloc != other.get_allocator(), entonces lineal.init.Excepciones
Las llamadas a Allocator::allocate pueden lanzar.
Notas
Después de la construcción por movimiento de un contenedor (la sobrecarga (4)), las referencias, punteros e iteradores (aparte del iterador al final) a other permanecen válidos, pero se refieren a los elementos que ahora se encuentran en *this. El estándar actual da esta garantía vía la generalización en [container.requirements.general]/12, y una garantía más directa está bajo consideración vía LWG 2321.
Aunque no se requiere formalmente hasta C++23, algunas implementaciones ya han puesto el parámetro de plantilla Allocator en los contextos no deducidos en modalidades más tempranas.
Ejemplo
#include <unordered_map>
#include <vector>
#include <bitset>
#include <string>
#include <utility>
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; }
};
namespace std {
template<> struct hash<Foo> {
std::size_t operator()(const Foo &f) const {
return std::hash<int>{}(f.val);
}
};
}
int main()
{
// constructor por defecto: mapa vacío
std::unordered_map<std::string, std::string> m1;
// constructor de lista
std::unordered_map<int, std::string> m2 =
{
{1, "foo"},
{3, "bar"},
{2, "baz"},
};
// constructor de copia
std::unordered_map<int, std::string> m3 = m2;
// constructor de movimiento
std::unordered_map<int, std::string> m4 = std::move(m2);
// constructor de rango
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());
// Opción 1 para un constructor con tipo clave personalizado
// Definir las estructuras KeyHash y KeyEqual structs y
// usarlas en la plantilla
std::unordered_map<Key, std::string, KeyHash, KeyEqual> m6 = {
{ {"John", "Doe"}, "example"},
{ {"Mary", "Sue"}, "another"}
};
// Opción 2 para un constructor con tipo clave personalizado
// Definir un operador const == operator para la clase/estructura
// y especilizar la estructura std::hash en el espacio de nombres std
std::unordered_map<Foo, std::string> m7 = {
{ Foo(1), "One"}, { 2, "Two"}, { 3, "Three"}
};
// Opción 3: Usar lambdas
// Ten en cuanta que la cuenta de depósitos inicial
// tiene que pasarse al 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);
}
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2193 | C++11 | El constructor por defecto es explicit.
|
Se hizo no explicit.
|
Véase también
(C++11) |
Asigna valores al contenedor. (función miembro pública) |