Map vs unordered_map для нескольких элементов

Я пытаюсь выбрать между map и unordered_map для следующего использования:

Ключ map - это указатель. Наиболее распространенным вариантом использования является то, что на карте будет один элемент. В общем, максимальное количество элементов на карте меньше 10. Доступ к карте осуществляется очень часто, и скорость является самым важным фактором. Изменения на карте нечасты.

Измеряя скорость, очевидно, правильный подход здесь, этот код будет использоваться на нескольких платформах, поэтому я пытаюсь создать общее правило для выбора между map и unordered_map на основе количества элементов, Я видел здесь несколько сообщений, которые подсказывают, что std:: map может быть быстрее для небольших элементов, но определение "small" не было указано.

Есть ли правило для того, чтобы выбрать между map и unordered_map в зависимости от количества элементов? Еще лучшая структура данных (например, линейный поиск через vector)?

Ответы

Ответ 1

В предположении, что вам всегда нужно измерять, чтобы выяснить, что более уместно с точки зрения производительности, если все это верно:

  • Изменения на карте не часто встречаются;
  • Карта содержит не более 10 элементов;
  • Поиск будет частым,
  • Вы заботитесь о производительности,

Тогда я бы сказал, что вам лучше разместить свои элементы в std::vector и выполнить простую итерацию по всем вашим элементам, чтобы найти тот, который вы ищете.

An std::vector будет выделять свои элементы в смежном регионе памяти, поэтому локальность кэша, скорее всего, даст вам большую производительность - время, необходимое для извлечения строки кэша из основной памяти после промаха в кеше, по крайней мере, одного порядка на величину, превышающую время, необходимое для доступа к кэшу ЦП.

Довольно интересно, что Boost flat_map идеально подходит для вашего случая использования (любезно предоставлено Praetorian):

flat_map похож на std::map, но он реализован как упорядоченный вектор. (из онлайн-документации)

Итак, если вы используете Boost для вас, вы можете попробовать это.

Ответ 2

Я считаю, что ваш случай из 10 элементов или меньше, и обычно только один линейный поиск несортированного вектора будет работать лучше всего. Однако, в зависимости от используемого алгоритма хеширования, функция unordered_map может быть быстрее.

Вам должно быть достаточно легко ориентироваться.