Jump to content

Неупорядоченные ассоциативные контейнеры (C++)

(Перенаправлено из неупорядоченной карты (C++) )

В языке программирования C++ неупорядоченные ассоциативные контейнеры представляют собой группу шаблонов классов в стандартной библиотеке C++ , которые реализуют варианты хеш-таблиц . Будучи шаблонами , они могут использоваться для хранения произвольных элементов, таких как целые числа или пользовательские классы. В текущей версии стандарта C++ определены следующие контейнеры: unordered_set, unordered_map, unordered_multiset, unordered_multimap. Каждый из этих контейнеров отличается только ограничениями, налагаемыми на их элементы.

Неупорядоченные ассоциативные контейнеры аналогичны ассоциативным контейнерам стандартной библиотеки C++, но имеют другие ограничения. Как следует из названия, элементы в неупорядоченных ассоциативных контейнерах не упорядочены . Это связано с использованием хеширования для хранения объектов. Контейнеры по-прежнему можно перебирать , как обычный ассоциативный контейнер.

Первой широко используемой реализацией хеш-таблиц на языке C++ была hash_map, hash_set, hash_multimap, hash_multiset шаблоны классов Silicon Graphics (SGI) стандартной библиотеки шаблонов (STL). [ 1 ] Из-за своей полезности они позже были включены в несколько других реализаций стандартной библиотеки C++ (например, в коллекцию компиляторов GNU (GCC) libstdc++). [ 2 ] и стандартная библиотека Visual C++ (MSVC).

The hash_* шаблоны классов были предложены в Техническом отчете C++ 1 (C++ TR1) и приняты под именами unordered_*. [ 3 ] Позже они были включены в версию C++11 стандарта C++. [ 4 ] Реализация также доступна в библиотеках Boost C++ как <boost/unordered_map.hpp>. [ 5 ]

Обзор функций

[ редактировать ]

Контейнеры определяются в заголовках, названных по именам контейнеров, например: unordered_set определяется в заголовке <unordered_set>. Все контейнеры удовлетворяют требованиям Container концепции , а это значит, что они имеют begin(), end(), size(), max_size(), empty(), и swap() методы.

unordered_set
( С++ 11 )
unordered_map
(С++11)
unordered_multiset
(С++11)
unordered_multimap
(С++11)
Описание
(конструктор) (конструктор) (конструктор) (конструктор) Создает контейнер из различных источников.
(деструктор) (деструктор) (деструктор) (деструктор) Уничтожает набор и содержащиеся в нем элементы
operator= operator= operator= operator= Присваивает значения контейнеру
get_allocator get_allocator get_allocator get_allocator Возвращает распределитель, используемый для выделения памяти для элементов.
Доступ к элементу at Доступ к указанному элементу с проверкой границ.
operator[] Доступ к указанному элементу без проверки границ.
Итераторы begin begin begin begin Возвращает итератор в начало контейнера
end end end end Возвращает итератор до конца контейнера
Емкость empty empty empty empty Проверяет, пуст ли контейнер
size size size size Возвращает количество элементов в контейнере.
max_size max_size max_size max_size Возвращает максимально возможное количество элементов в контейнере
Модификаторы clear clear clear clear Очищает содержимое.
insert insert insert insert Вставляет элементы.
emplace emplace emplace emplace Конструирует элементы на месте ( C++11 )
emplace_hint emplace_hint emplace_hint emplace_hint Конструирует элементы на месте, используя подсказку ( C++11 ).
erase erase erase erase Стирает элементы.
swap swap swap swap Заменяет содержимое другим контейнером.
Искать count count count count Возвращает количество элементов, соответствующих определенному ключу.
find find find find Находит элемент с определенным ключом.
equal_range equal_range equal_range equal_range Возвращает диапазон элементов, соответствующих определенному ключу.
Интерфейс сегмента ...
Хэш-политика ...
наблюдатели hash_function hash_function hash_function hash_function Возвращает функцию, используемую для создания хэша ключа.
key_eq key_eq key_eq key_eq Возвращает функцию сравнения ключей.

Пример использования

[ редактировать ]
#include <iostream>
#include <string>
#include <unordered_map>
 
int main()
{
    std::unordered_map<std::string, int> months;
    months["january"] = 31;
    months["february"] = 28;
    months["march"] = 31;
    months["april"] = 30;
    months["may"] = 31;
    months["june"] = 30;
    months["july"] = 31;
    months["august"] = 31;
    months["september"] = 30;
    months["october"] = 31;
    months["november"] = 30;
    months["december"] = 31;
    std::cout << "september -> " << months["september"] << std::endl;
    std::cout << "april     -> " << months["april"] << std::endl;
    std::cout << "december  -> " << months["december"] << std::endl;
    std::cout << "february  -> " << months["february"] << std::endl;
    return 0;
}

Пользовательские хэш-функции

[ редактировать ]

Чтобы использовать пользовательские объекты в std::unordered_map, необходимо определить пользовательскую хеш-функцию. Эта функция принимает константную ссылку на пользовательский тип и возвращает size_t.

#include <unordered_map>
 
struct X{int i,j,k;};

struct hash_X{
  size_t operator()(const X &x) const{
    return std::hash<int>()(x.i) ^ std::hash<int>()(x.j) ^ std::hash<int>()(x.k);
  }
};

Пользовательскую функцию можно использовать как есть в std::unordered_map, передав ее в качестве параметра шаблона.

 std::unordered_map<X,int,hash_X> my_map;

Или может быть установлен в качестве хэш-функции по умолчанию, специализируясь на функции std::hash.

namespace std {
    template <>
        class hash<X>{
        public :
        size_t operator()(const X &x ) const{
            return hash<int>()(x.i) ^ hash<int>()(x.j) ^ hash<int>()(x.k);
        }
    };
}

//...
 std::unordered_map<X,int> my_map;
  1. ^ «hash_map<Key, Data, HashFcn, EqualKey, Alloc>» . Кремниевая графика (SGI) . Проверено 26 января 2011 г.
  2. ^ «libstdc++: Справочник шаблонов классов hash_map» . Проверено 26 января 2011 г.
  3. ^ WG21 (9 апреля 2003 г.). «Предложение о добавлении хеш-таблиц в стандартную библиотеку (редакция 4)» . н1456. {{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
  4. ^ WG21 (21 августа 2010 г.), Рабочий проект стандарта языка программирования C++ (PDF) , n3126 {{citation}}: CS1 maint: числовые имена: список авторов ( ссылка )
  5. ^ «Шаблон класса unordered_map» . Способствовать росту . Проверено 26 января 2011 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: dec637068de9cc34c1750ac4bf11fec6__1702482540
URL1:https://arc.ask3.ru/arc/aa/de/c6/dec637068de9cc34c1750ac4bf11fec6.html
Заголовок, (Title) документа по адресу, URL1:
Unordered associative containers (C++) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)