хэш-функция для boost_unordered, по умолчанию невозможно? - PullRequest
1 голос
/ 26 ноября 2010

У меня есть класс, который имеет list of items (экземпляр класса с именем ItemList). Этот класс ItemList имеет такие функции, как:

ItemIndexType AddItem(...);
void DoSomething(ItemIndexType index, ...);

ItemIndexType действует как своего рода «умный итератор» и имеет переменные-члены
myIter (iterator to a multimap in the ItemList)
myList (pointer to the ItemList).
И еще несколько используются для домашнего хозяйства.
Это разумно, поскольку, если бы я удалил элемент из ItemList, все индексы, которые указывают на элемент, будут очищены. (указывая на конец карты).

Сейчас он работает так, как задумано, и я больше не буду его сильно менять. Однако для приложения мне нужно сделать что-то дополнительное: я создаю функцию сброса:

void ResetItem(ItemIndexType ind);

Эта функция затем "сбрасывает" элемент ind, указывающий на исходное значение. Я не хочу хранить значение orignal в классе элемента, поэтому я решил создать контейнер, который будет иметь в качестве ключа itemindex и в качестве значения исходные аргументы, с помощью которых был создан элемент.

Поскольку заказ не только не нужен, но и невозможен, я думаю, что boost :: unordered - это то, что нужно.
Изменение deque, которое я использовал для отслеживания индексов в хэш-таблице, привело к странной ошибке:

X \ boost \ functions \ hash \ extensions.hpp (176): ошибка C2665: 'boost :: hash_value': ни одна из 16 перегрузок не может преобразовать все типы аргументов

Где список создается:

typedef boost::unordered_map<ItemIndexType, ListDataType> ListContType;

Как создать хеш-функцию для пользовательского типа данных?

1 Ответ

2 голосов
/ 28 ноября 2010

Вам нужен предикат равенства и хеш-функция для вашего ключевого типа данных, см. Предикаты равенства и хеш-функции .Вы можете создать свою хеш-функцию, комбинируя хеш-функции простых типов с boost :: hash_combine

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...