Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/65: Рейтинг темы: голосов - 65, средняя оценка - 4.92
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249

Unordered_map правильное применение

25.11.2017, 15:26. Показов 13858. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил разобраться с этим контейнером, но не вижу ни одной комплексной сатьи по этой теме.
Кто нибудь может ответить на простые вопросы:
1)Имеют ли данные контейнеры практический смысл в сравнение с вектором у которого свой аллокатор ?
2)Я так понимаю что контейнер малопригоден в готовом виде с параметрами по умолчанию ?
3)Если его использовать не в готовом, то хеши надо солить. а солить можно по разному и есть ли какая нибудь удачная реализация (так как чувствую что создам велосипед, если буду делать сам) ?
4)Чем отличается реализация boost unordered_map от std::unordered_map?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.11.2017, 15:26
Ответы с готовыми решениями:

Каким образом unordered_map выдает правильное значение для ключа, если его хеш функция допускает коллизии?
Читаю книгу джосаттис стандартная библиотека c++, там в разделе про unordered_map есть описание данного контейнера Раз уж каждый...

Правильное применение функций
Есть задачка одна, студенческая, простая вроде, проблема лишь в том что к ней надо подключить функции, функции вроде понел как их...

Правильное применение перечисления enum
Дело в том, что не пойму как работать с перечислением. Мне нужно, чтобы программа принимала данные о 3 сотрудниках ( дата найма на работу,...

62
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.11.2017, 15:37
При чём тут вектор? Он не заменяет map.
В boost должно быть тоже самое. Оттуда он и пришёл.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 15:41  [ТС]
nmcf, Вектор тут при том что он имеет соизмеримую оценку производительности по операциям поиска, а если с аллокатором то и по операциям вставки т.е. константу.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 16:48
Цитата Сообщение от Pechkin80 Посмотреть сообщение
а если с аллокатором то и по операциям вставки т.е. константу.
Вы заблуждаетесь. Вектор это всегда непрерывный кусок памяти.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 16:51  [ТС]
avgoor, Я в курсе, но вектор это динамический массив.

Добавлено через 1 минуту
точнее обертка над динамическим массивом + сам массив
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 16:52
Pechkin80, Ну, вставтье в середину вектора элемент без сдвига остальных...
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 16:53
Цитата Сообщение от Pechkin80 Посмотреть сообщение
он имеет соизмеримую оценку производительности по операциям поиска
только если он был заранее отсортирован.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 16:57  [ТС]
avgoor, ну так unordered_map вам вообще не гарантирует в какое место он вставит.

Добавлено через 1 минуту
TRam_, Необязательно, в данном контексте я имею ввиду если известен индекс, так как при использовании unordered_map мы подразумеваем что ключ известен.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 17:01
Цитата Сообщение от Pechkin80 Посмотреть сообщение
ну так unordered_map вам вообще не гарантирует в какое место он вставит.
Но он гарантирует (с оговорками) константный доступ по ключу. Отсортированный вектор корректно сравнивать с map, а не unordered_map (у обоих логарифмическое время). Плюс вставка даже в конец вектора иногда требует реаллокации. Константная вставка у дека.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 17:09  [ТС]
avgoor, У вектора тоже константный доступ к ключу, если известен индекс (как аналог ключа). А сортированный вектор или нет это в данном контексте без разницы.

Добавлено через 5 минут
По поводу вставки я специально оговорился в первом посте, то я рассматриваю случай с кастомным аллокатором. Тем более оба контейнера резервируют память по элементы.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 17:09
Цитата Сообщение от Pechkin80 Посмотреть сообщение
известен индекс (как аналог ключа)
Если у нас есть функция преобразования ключа в индекс, то это хэш-таблица. Если у нас поиск идёт по индексу, то время для вектора константно, а вот для map'ов останется логарифмическим.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 17:11
Цитата Сообщение от Pechkin80 Посмотреть сообщение
если известен индекс (как аналог ключа)
Откуда же он известен?
map и unordered_map ставят в соответствие значению ключа почти любого типа другое значение. Когда говорят о соответствии вектора мапу - обычно имеют ввиду вектор пар ключ-значение, отсортированный по ключу. И чтобы определить индекс в векторе нужен поиск.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 17:15  [ТС]
TRam_, Я про map тут ничего не говорил. Я только unordered_map который к map не имеет никакого отношения (кроме того что оба ассоциативные контейнеры)

Добавлено через 3 минуты
avgoor, Поиск в данном случае это только получение адреса по ключу и не более. Поиск в обычном смысли в unordered_map сравним с вектором т.е. оба O(n)
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 17:20
Pechkin80, Вот вам задача: хранятся данные об уголовных элементах Т.е. Каждому ФИО соответствует "погоняло". Задача, соответственно, по погонялу определить ФИО (ну, или наоборот, как вам нравится). Решить через вектор.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 17:27  [ТС]
avgoor, Я понял ответ на первый вопрос. т.е. преимущество хеш-таблиц когда индекс неизвестен и надо искать очень быстро. С вопросами 2-4 пока непонятно.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 17:36
Цитата Сообщение от Pechkin80 Посмотреть сообщение
преимущество хеш-таблиц когда индекс неизвестен и надо искать очень быстро. С вопросами 2-4 пока непонятно.
Я б сказал не преимущество, а прямое предназначение (организовать соответствие одних данных другим)

2) Вполне пригоден. Только, если тип ключа свой - надо указать hasher.
3) Ничего солить не надо. Скорее наоборот - ситуации в которых стандартные алгоритмы хэшей не подходят достаточно редкие.
4) Посмотрите. заодно поймете как работают хэш таблицы

В яве, например, используется именно HashMap по умолчанию.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 17:44  [ТС]
Цитата Сообщение от avgoor
3) Ничего солить не надо. Скорее наоборот - ситуации в которых стандартные алгоритмы хэшей не подходят достаточно редкие.
Ну во первых, я тоже думаю что стандартные алгоритмы вполне хороши, вопрос не в алгоритмах а в данных. Солят не из-за плохих алгоритмов, а из-за данных которые могут вызывать коллизии и вот про эти "редкие" случае я и виду речь. Но мой вопрос шире ем когда солить, а когда не солить. Просто интересно чтото универсальное. Так как хеш таблица это штука ненужная для малых n(при малых n простой перебор может быть быстрее), то и дополнительные затраты на универсальность не страшны.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.11.2017, 17:45
Выше уже намекнули, попробую дополнить.
Нужно рассматривать вопрос гораздо шире - где нужна хеш таблица и в чем она лучше массива (читай вектора).
Цитата Сообщение от Pechkin80 Посмотреть сообщение
1)Имеют ли данные контейнеры практический смысл в сравнение с вектором у которого свой аллокатор ?
Как выше писали сравнивать вектор и мап это теплое с мягким.
Цитата Сообщение от Pechkin80 Посмотреть сообщение
2)Я так понимаю что контейнер малопригоден в готовом виде с параметрами по умолчанию ?
Пригоден, именно так он и используется в 99% случаев, 1% - это специфичный случай (особая архитектура системы или особые требования к продукту)
Цитата Сообщение от Pechkin80 Посмотреть сообщение
3)Если его использовать не в готовом, то хеши надо солить. а солить можно по разному и есть ли какая нибудь удачная реализация (так как чувствую что создам велосипед, если буду делать сам) ?
Соль тут не при чем, ты думаешь в другую сторону. Соль нужна когда ты пароли пользователей в БД пишешь, а тут просто хеш-таблица (контейнер с быстрым доступом по ключу любого типа)
Цитата Сообщение от Pechkin80 Посмотреть сообщение
4)Чем отличается реализация boost unordered_map от std::unordered_map?
Вопрос не корректен. Никто не знает как это делается в std::, потому что в стандарте есть только требования по скорости операций (выраженные через big O). Плюс явный намек на то, что хеш таблица (unordered_map) использует баккеты (buckets). Сама же реализация может сильно отличаться например в stdlib от майкрософт и от gnu сообщества могут иметь совершенно разные реализации.

Советую почитать про реализацию хеш-таблиц (точнее про разрешение коллизий) - метод открытой адресации и метод цепочек. Потом придти на форум с правильным вопросом "когда использовать std::map а когда std::unordered_map"
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 17:51
Цитата Сообщение от Pechkin80 Посмотреть сообщение
данных которые могут вызывать коллизии
Случай, когда мы задаём для точно такого же ключа новое значение коллизией не называется.

По поводу универсальности - чем больше элементов в таблице, тем больше должен быть её размер (т.е. диапазон разбивки индексов должен расти быстрее, чем длина ключа )
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 17:55  [ТС]
Я может толком не объяснил, но я про случай когда ключ это захешированные данные часто т.е. в паре {Key, Data} Key = F(Data). Наверно корректнее былобы рассматривать unordered_set, но не так важно. Суть в то что пространство ключей меньше пространства данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2017, 17:55
Помогаю со студенческими работами здесь

Контейнер unordered_map<string, unordered_map<string,int>>
Ну можно и не unordered_map&lt;string, unordered_map&lt;string,int&gt;&gt;. Мне нужен контейнер который будет по 2 ключам типа string выдавать int. ...

Правильное применение с basic_stream
Доброго времени суток! Класс ios_base&lt;&gt; дает нам стандартные потоки из/в файл, строку и консоль. Допустим, если я хочу получать...

Правильное применение !
Решил открыть сайт о играх и фильмах, есть уже около 1000 готовых копирайт статей ... тематика сайта именно рецензии и описания, а не...

Правильное применение токового зеркала
Всем привет. Хочу собрать усилитель на транзисторе с низкими собственными шумами. Нагрузка высокоимпедансная, поэтому надо ограничить...

VAO, VBO и их правильное применение
Всех с наступившем, в общем меня интересует вопрос как правильно использовать VBO и VAO чтобы достичь максимального быстродействия. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru