Namespaces
Variants

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: unordered_map

From cppreference.net

(1)
unordered_map ( )
: unordered_map ( size_type ( /* unspecified */ ) ) { }
(начиная с C++11)
(до C++20)
unordered_map ( ) ;
(начиная с C++20)
explicit unordered_map ( size_type bucket_count,

const Hash & hash = Hash ( ) ,
const key_equal & equal = key_equal ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(2) (начиная с C++11)
unordered_map ( size_type bucket_count,

const Allocator & alloc )

: unordered_map ( bucket_count, Hash ( ) , key_equal ( ) , alloc ) { }
(3) (начиная с C++14)
unordered_map ( size_type bucket_count,

const Hash & hash,
const Allocator & alloc )

: unordered_map ( bucket_count, hash, key_equal ( ) , alloc ) { }
(4) (начиная с C++14)
explicit unordered_map ( const Allocator & alloc ) ;
(5) (начиная с C++11)
template < class InputIt >

unordered_map ( InputIt first, InputIt last,
size_type bucket_count = /* не указано */ ,
const Hash & hash = Hash ( ) ,
const key_equal & equal = key_equal ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(6) (начиная с C++11)
template < class InputIt >

unordered_map ( InputIt first, InputIt last,
size_type bucket_count,
const Allocator & alloc )
: unordered_map ( first, last,

bucket_count, Hash ( ) , key_equal ( ) , alloc ) { }
(7) (начиная с C++14)
template < class InputIt >

unordered_map ( InputIt first, InputIt last,
size_type bucket_count,
const Hash & hash,
const Allocator & alloc )
: unordered_map ( first, last,

bucket_count, hash, key_equal ( ) , alloc ) { }
(8) (начиная с C++14)
unordered_map ( const unordered_map & other ) ;
(9) (начиная с C++11)
unordered_map ( const unordered_map & other, const Allocator & alloc ) ;
(10) (начиная с C++11)
unordered_map ( unordered_map && other ) ;
(11) (начиная с C++11)
unordered_map ( unordered_map && other, const Allocator & alloc ) ;
(12) (начиная с C++11)
unordered_map ( std:: initializer_list < value_type > init,

size_type bucket_count = /* не указано */ ,
const Hash & hash = Hash ( ) ,
const key_equal & equal = key_equal ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(13) (начиная с C++11)
unordered_map ( std:: initializer_list < value_type > init,

size_type bucket_count,
const Allocator & alloc )
: unordered_map ( init, bucket_count,

Hash ( ) , key_equal ( ) , alloc ) { }
(14) (начиная с C++14)
unordered_map ( std:: initializer_list < value_type > init,

size_type bucket_count,
const Hash & hash,
const Allocator & alloc )
: unordered_map ( init, bucket_count,

hash, key_equal ( ) , alloc ) { }
(15) (начиная с C++14)
template < container-compatible-range < value_type > R >

unordered_map ( std:: from_range_t , R && rg,
size_type bucket_count = /* см. описание */ ,
const Hash & hash = Hash ( ) ,
const key_equal & equal = key_equal ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(16) (начиная с C++23)
template < container-compatible-range < value_type > R >

unordered_map ( std:: from_range_t , R && rg,
size_type bucket_count,
const Allocator & alloc )
: unordered_map ( std:: from_range , std:: forward < R > ( rg ) ,

bucket_count, Hash ( ) , key_equal ( ) , alloc ) { }
(17) (начиная с C++23)
template < container-compatible-range < value_type > R >

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 ) ,

bucket_count, hash, key_equal ( ) , alloc ) { }
(18) (начиная с C++23)

Создает новый контейнер из различных источников данных. Опционально использует предоставленное пользователем bucket_count в качестве минимального количества создаваемых сегментов, hash в качестве хэш-функции, equal в качестве функции сравнения ключей и alloc в качестве аллокатора.

1-5) Создает пустой контейнер. Устанавливает max_load_factor() в значение 1.0 . Для конструктора по умолчанию количество сегментов не определено.
6-8) Конструирует контейнер с содержимым диапазона [ first , last ) . Устанавливает max_load_factor() в значение 1.0 . Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (в ожидании LWG2844 ).
9,10) Конструктор копирования. Создает контейнер с копией содержимого other , также копирует коэффициент загрузки, предикат и хэш-функцию. Если alloc не предоставлен, аллокатор получается путем вызова std:: allocator_traits < allocator_type > :: select_on_container_copy_construction ( other. get_allocator ( ) ) .

Параметр шаблона Allocator выводится только из первого аргумента при использовании вывода аргументов шаблона класса .

(начиная с C++23)
11,12) Конструктор перемещения . Создает контейнер с содержимым other с использованием семантики перемещения. Если alloc не предоставлен, аллокатор получается путем перемещения из аллокатора, принадлежащего other .

Параметр шаблона Allocator выводится только из первого аргумента при использовании вывода аргументов шаблона класса .

(начиная с C++23)
13-15) Конструктор со списком инициализации . Создает контейнер с содержимым списка инициализации init , аналогично unordered_map ( init. begin ( ) , init. end ( ) ) .
16-18) Конструирует контейнер с содержимым из rg . Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (в ожидании LWG2844 ).

Содержание

Параметры

alloc - аллокатор для использования во всех выделениях памяти этого контейнера
bucket_count - минимальное количество корзин для использования при инициализации. Если не указано, используется неопределенное значение по умолчанию
hash - хеш-функция для использования
equal - функция сравнения для использования во всех сравнениях ключей этого контейнера
first, last - пара итераторов, определяющая исходный диапазон элементов для копирования
rg - совместимый с контейнером диапазон , то есть input_range , элементы которого конвертируются в value_type
other - другой контейнер, используемый в качестве источника для инициализации элементов контейнера
init - список инициализации для инициализации элементов контейнера
Требования к типам
-
InputIt должен удовлетворять требованиям LegacyInputIterator .

Сложность

1-5) Константа.
6-8) В среднем линейная сложность (т.е. O(N) , где N равно std:: distance ( first, last ) ), в худшем случае квадратичная, т.е. O(N 2 ) .
9,10) Линейно по размеру other .
11,12) Константная. Если alloc задан и alloc ! = other. get_allocator ( ) , то линейная.
13-15) Средний случай O(N) ( N это std:: size ( init ) ), худший случай O(N 2 ) .
16-18) Средний случай O(N) ( N это ranges:: distance ( rg ) ), худший случай O(N 2 ) .

Исключения

Вызовы Allocator::allocate могут генерировать исключения.

Примечания

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 2321 .

Хотя формально это не требовалось до C++23, некоторые реализации уже помещали параметр шаблона Allocator в невыводимые контексты в более ранних режимах.

Feature-test macro Value Std Feature
__cpp_lib_containers_ranges 202202L (C++23) Ranges-aware construction and insertion; overloads ( 16-18 )

Пример

#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.первый) ^
            (std::hash<std::string>()(k.second) << 1);
    }
};
struct KeyEqual
{
    bool operator()(const Key& lhs, const Key& rhs) const
    {
        return lhs.первый == rhs.первый && 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()
{
    // конструктор по умолчанию: пустой map
    std::unordered_map<std::string, std::string> m1;
    // конструктор списка
    std::unordered_map<int, std::string> m2 =
    {
        {1, "foo"},
        {3, "bar"},
        {2, "baz"}
    };
    // конструктор копирования
    std::unordered_map<int, std::string> m3 = m2;
    // move constructor
    std::unordered_map<int, std::string> m4 = std::move(m2);
    // конструктор диапазона
    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());
    // Вариант 1 для конструктора с пользовательским типом Key
    // Определите структуры KeyHash и KeyEqual и используйте их в шаблоне
    std::unordered_map<Key, std::string, KeyHash, KeyEqual> m6 =
    {
        {{"Джон", "Доу"}, "пример"},
        {{"Мэри", "Сью"}, "другой"}
    };
    // Вариант 2 для конструктора с пользовательским типом Key.
    // Определите const == оператор для класса/структуры и специализируйте std::hash
    // структура в пространстве имен std
    std::unordered_map<Foo, std::string> m7 =
    {
        {Foo(1), "Один"}, {2, "Два"}, {3, "Три"}
    };
    // Вариант 3: Использование лямбда-выражений
    // Обратите внимание, что начальное количество сегментов должно быть передано в конструктор
    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);
}

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2193 C++11 конструктор по умолчанию ( 1 ) был explicit сделан не-explicit
LWG 2230 C++11 семантика перегрузки ( 13 ) не была определена определена

Смотрите также

присваивает значения контейнеру
(public member function)