Укажите минимальное количество сегментов при построении boost::unordered_map

StackOverflow https://stackoverflow.com/questions/694572

  •  22-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать boost::unordered_map для кэширования некоторых значений.Я пытаюсь указать минимальное количество сегментов в конструкторе:

#include <boost/unordered_map.hpp>
typedef boost::unordered_map<float, float> Mycache;
Mycache cache((std::size_t)25165843,
              boost::hash<float>(),
              std::equal_to<float>(),
              std::allocator<std::pair<float const, float> >());

Но когда я показываю информацию о своей unordered_map в конце программы:

г++:

unordered_map.size(): 15861612
unordered_map.load_factor: 10.0845
unordered_map.bucket_count: 1572869
unordered_map.max_size: 1572868
unordered_map.max_load_factor: 1
unordered_map.max_bucket_count: 1572869

ВС++:

unordered_map.size(): 13916119
unordered_map.load_factor: 8.8476
unordered_map.bucket_count: 1572869
unordered_map.max_size: 1572868
unordered_map.max_load_factor: 1
unordered_map.max_bucket_count: 1572869

Как указать минимальное количество сегментов?

Это было полезно?

Решение

boost::unordered_map::max_bucket_count() возвращает зависящее от реализации ограничение на количество сегментов unordered_map.Похоже, вы превысили этот предел с помощью параметра конструктора.Обратите внимание: хотя MSDN определяет это максимальное количество сегментов, разрешенное «на данный момент» (что бы это ни значило), спецификация C++0x определяет это как максимальное количество сегментов, которое может когда-либо иметь карта.

Я никогда не использовал этот класс и не вижу в черновике спецификации C++0x ничего, что могло бы объяснить, почему конструктор молча создает объект, который не делает то, что вы ему сказали.

Я также не знаю, какая мотивация может стоять за этой ценностью. 1572869, кроме того, это большое простое число.

Другие советы

Другой ответ верен в отношении стандарта, но небольшой max_bucket_count на самом деле это ошибка в Boost 1.38, любая другая версия позволит вам использовать больше сегментов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top