Пространства имён
Варианты
Действия

std::unordered_map

Материал из cppreference.com
< cpp‎ | container
 
 
 
 
Определено в заголовочном файле <unordered_map>
template<

    class Key,
    class T,
    class Hash =std::hash<Key>,
    class KeyEqual =std::equal_to<Key>,
    class Allocator =std::allocator<std::pair<const Key, T>>

>class unordered_map;
(1) (начиная с C++11)
namespace pmr {

template<class Key,
    class T,
    class Hash =std::hash<Key>,
    class Pred =std::equal_to<Key>
>using unordered_map = std::unordered_map<Key, T, Hash, Pred,
                            std::pmr::polymorphic_allocator<std::pair<const Key,T>>>;

}
(2) (начиная с C++17)

std::unordered_map это ассоциативный контейнер, содержащий пары ключ-значение с уникальными ключами. Поиск, вставка и удаление элементов имеют среднюю постоянную сложность.

Внутри элементы не сортируются в каком-либо определённом порядке, а организованы в сегменты. В какой сегмент помещается элемент, полностью зависит от хеша его ключа. Ключи с одинаковым хэш-кодом находятся в одном сегменте. Это обеспечивает быстрый доступ к отдельным элементам, поскольку после вычисления хэша он обращается к точному сегменту, в котором размещён элемент.

Два ключа считаются эквивалентными, если предикат равенства ключей карты возвращает true при передаче этих ключей. Если два ключа эквивалентны, хэш-функция должна возвращать одно и то же значение для обоих ключей.

std::unordered_map соответствует требованиям Container, AllocatorAwareContainer, UnorderedAssociativeContainer.

Содержание

[править]Аннулирование итератора

Операции Недействителен
Все операции только для чтения, swap, std::swap Ни один
clear, rehash, reserve, operator= Все
insert, emplace, emplace_hint, operator[] Только если вызывает перехэширование
erase Только на стёртый элемент

[править]Примечание

  • Функции обмена не делают недействительными ни один из итераторов внутри контейнера, но они делают недействительным итератор, отмечающий конец области обмена.
  • Ссылки и указатели на любой ключ или данные, хранящиеся в контейнере, становятся недействительными только при удалении этого элемента, даже если соответствующий итератор становится недействительным.

[править]Параметры шаблона

[править]Типы элементы

Тип элемент Определение
key_typeKey[править]
mapped_typeT[править]
value_typestd::pair<const Key, T>[править]
size_type Беззнаковый целочисленный тип (обычно std::size_t) [править]
difference_type Знаковый целочисленный тип (обычно std::ptrdiff_t) [править]
hasherHash[править]
key_equalKeyEqual[править]
allocator_typeAllocator[править]
referencevalue_type&[править]
const_referenceconst value_type&[править]
pointerstd::allocator_traits<Allocator>::pointer[править]
const_pointerstd::allocator_traits<Allocator>::const_pointer[править]
iteratorLegacyForwardIterator в value_type[править]
const_iteratorLegacyForwardIterator в const value_type[править]
local_iterator Тип итератора, category, value, difference, pointer и
ссылочные типы которого совпадают с типами iterator. Этот итератор
можно использовать для итерации по одному сегменту, но не по сегментам.[править]
const_local_iterator Тип итератора, category, value, difference, pointer и
ссылочные типы которого совпадают с типами const_iterator. Этот итератор можно использовать для итерации по одному сегменту, но не по сегментам.[править]
node_type(начиная с C++17) специализация дескриптора узла, представляющая узел контейнера [править]
insert_return_type(начиная с C++17) тип, описывающий результат вставки node_type, специализация

template<class Iter, class NodeType>struct/*неопределена*/{
    Iter     position;
    bool     inserted;
    NodeType node;
};

создаётся с аргументами шаблона iterator и node_type. [править]

[править]Функции элементы

создаёт unordered_map
(public функция-элемент)[править]
уничтожает unordered_map
(public функция-элемент)[править]
(C++11)
присваивает значения контейнеру
(public функция-элемент)[править]
возвращает связанный аллокатор
(public функция-элемент)[править]
Итераторы
возвращает итератор на начало
(public функция-элемент)[править]
(C++11)
возвращает итератор на конец
(public функция-элемент)[править]
Ёмкость
(C++11)
проверяет, пуст ли контейнер
(public функция-элемент)[править]
(C++11)
возвращает количество элементов
(public функция-элемент)[править]
(C++11)
возвращает максимально возможное количество элементов
(public функция-элемент)[править]
Модификаторы
(C++11)
очищает содержимое
(public функция-элемент)[править]
(C++11)
вставляет элементы или узлы(начиная с C++17)
(public функция-элемент)[править]
вставляет ряд элементов
(public функция-элемент)[править]
вставляет элемент или присваивает текущему элементу, если ключ уже существует
(public функция-элемент)[править]
(C++11)
создаёт элемент на месте
(public функция-элемент)[править]
создаёт элементы на месте, используя подсказку
(public функция-элемент)[править]
вставляет "на месте", если ключ не существует, ничего не делает, если ключ существует
(public функция-элемент)[править]
(C++11)
удаляет элементы
(public функция-элемент)[править]
(C++11)
обменивает содержимое
(public функция-элемент)[править]
(C++17)
извлекает узлы из контейнера
(public функция-элемент)[править]
(C++17)
сливает с узлами из другого контейнера
(public функция-элемент)[править]
Просмотр
(C++11)
предоставляет доступ к указанному элементу с проверкой границ
(public функция-элемент)[править]
(C++11)
предоставляет доступ к или вставляет указанному элементу
(public функция-элемент)[править]
(C++11)
возвращает количество элементов, соответствующих определённому ключу
(public функция-элемент)[править]
(C++11)
ищет элемент с определённым ключом
(public функция-элемент)[править]
(C++20)
проверяет, содержит ли контейнер элемент с определённым ключом
(public функция-элемент)[править]
возвращает диапазон элементов, соответствующих определённому ключу
(public функция-элемент)[править]
Интерфейс сегментов
возвращает итератор на начало указанного сегмента
(public функция-элемент)[править]
возвращает итератор на конец указанного сегмента
(public функция-элемент)[править]
возвращает количество сегментов
(public функция-элемент)[править]
возвращает максимальное количество сегментов
(public функция-элемент)[править]
возвращает количество элементов в конкретном сегменте
(public функция-элемент)[править]
(C++11)
возвращает сегмент для конкретного ключа
(public функция-элемент)[править]
Политика хеширования
возвращает среднее количество элементов на сегмент
(public функция-элемент)[править]
управляет максимальным средним количеством элементов на сегмент
(public функция-элемент)[править]
(C++11)
резервирует как минимум указанное количество сегментов и регенерирует хеш-таблицу
(public функция-элемент)[править]
(C++11)
резервирует место по крайней мере для указанного количества элементов и регенерирует хеш-таблицу
(public функция-элемент)[править]
Наблюдатели
возвращает функцию, используемую для хэширования ключей
(public функция-элемент)[править]
(C++11)
возвращает функцию, используемую для сравнения ключей на равенство
(public функция-элемент)[править]

[править]Функции, не являющиеся элементами

(удалено в C++20)
сравнивает значения в unordered_map
(шаблон функции)[править]
специализация алгоритма std::swap
(шаблон функции)[править]
стирает все элементы, соответствующие определённым критериям
(шаблон функции)[править]

Принципы вывода

(начиная с C++17)

[править]Примечание

Макрос тест функциональностиЗначениеСтандартКомментарий
__cpp_lib_containers_ranges202202L(C++23)Создание и вставка диапазонов для контейнеров

[править]Пример

#include <iostream>#include <string>#include <unordered_map>   int main(){// Создание unordered_map из трёх строк (которые сопоставляются со строками) std::unordered_map<std::string, std::string> u ={{"КРАСНЫЙ","#FF0000"}, {"ЗЕЛЁНЫЙ","#00FF00"}, {"СИНИЙ","#0000FF"}};   // Вспомогательная лямбда-функция для печати пар ключ-значениеauto print_key_value =[](constauto& key, constauto& value){std::cout<<"Ключ:["<< key <<"] Значение:["<< value <<"]\n";};   std::cout<<"Итерация и печать пар ключ-значение unordered_map,\n""с явным указанием их типов:\n";for(conststd::pair<conststd::string, std::string>& n : u ){ print_key_value(n.first, n.second);}   std::cout<<"\nИтерация и печать пар ключ-значение, ""используя структурную привязку C++17:\n";for(constauto&[key, value]: u ){ print_key_value(key, value);}   // Добавление двух новых записей в unordered_map u["ЧЁРНЫЙ"]="#000000"; u["БЕЛЫЙ"]="#FFFFFF";   std::cout<<"\nВывод значений по ключу:\n""Шестнадцатиричное значение цвета КРАСНЫЙ:["<< u["КРАСНЫЙ"]<<"]\n""Шестнадцатиричное значение цвета ЧЁРНЫЙ:["<< u["ЧЁРНЫЙ"]<<"]\n\n";   std::cout<<"Используйте operator[] с несуществующим ключом, ""чтобы вставить новую пару ключ-значение:\n"; print_key_value("новый_ключ", u["новый_ключ"]);   std::cout<<"\nИтерация и печать пар ключ-значение, используя `auto`;\n""новый_ключ теперь является одним из ключей в карте:\n";for(constauto& n : u ){ print_key_value(n.first, n.second);}}

Возможный вывод:

Итерация и печать пар ключ-значение unordered_map, с явным указанием их типов: Key:[СИНИЙ] Value:[#0000FF] Key:[ЗЕЛЁНЫЙ] Value:[#00FF00] Key:[КРАСНЫЙ] Value:[#FF0000]   Итерация и печать пар ключ-значение, используя структурную привязку C++17: Key:[СИНИЙ] Value:[#0000FF] Key:[ЗЕЛЁНЫЙ] Value:[#00FF00] Key:[КРАСНЫЙ] Value:[#FF0000]   Вывод значений по ключу: Шестнадцатиричное значение цвета КРАСНЫЙ:[#FF0000] Шестнадцатиричное значение цвета ЧЁРНЫЙ:[#000000]   Используйте operator[] с несуществующим ключом, чтобы вставить новую пару ключ-значение: Key:[новый_ключ] Value:[]   Итерация и печать пар ключ-значение, используя `auto`; новый_ключ теперь является одним из ключей в карте: Key:[новый_ключ] Value:[] Key:[БЕЛЫЙ] Value:[#FFFFFF] Key:[ЧЁРНЫЙ] Value:[#000000] Key:[СИНИЙ] Value:[#0000FF] Key:[ЗЕЛЁНЫЙ] Value:[#00FF00] Key:[КРАСНЫЙ] Value:[#FF0000]

[править]Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 2050 C++11 определения reference, const_reference, pointer и
const_pointer были основаны на allocator_type
на основе value_type и std::allocator_traits

[править]Смотрите также

коллекция пар ключ-значение, отсортированных по ключам, ключи уникальны
(шаблон класса)[править]

[править]Параметры шаблона

close