C ++, с использованием Visual Studio 2010. Вопрос о том, почему определяемая пользователем черта hash_map
фактически требует полного упорядочения.
У меня есть простая структура, скажем, FOO
, которая имеет только несколько целых чисел. Я хотел бы использовать hash_map
, которая является хеш-таблицей, ключи которой неупорядочены , для хранения структуры FOO
. Мне просто нужен быстрый поиск соответствующего значения, так что это правильный выбор: hash_map<FOO, int32_t>
.
Однако мне нужно реализовать собственную хеш-функцию и некоторые функции сравнения для FOO
. Вот определения hash_map
, взятые из MSDN:
template <
class Key,
class Type,
class Traits=hash_compare<Key, less<Key> >,
class Allocator=allocator<pair <const Key, Type> >
>
class hash_map
Оказалось, что мне нужно реализовать hash_compare
функторы:
template<class Key, class Traits = less<Key> >
class hash_compare
{
Traits comp;
public:
const size_t bucket_size = 4;
const size_t min_buckets = 8;
hash_compare( );
hash_compare( Traits pred );
size_t operator( )( const Key& _Key ) const; // This is a hash function
bool operator( )( // This is an ordering function
const Key& _Key1,
const Key& _Key2
) const;
};
Вот подробное описание операции bool () из MSDN:
Для любого значения _Key1 типа Key, которое
предшествует _Key2 в последовательности и имеет такое же хеш-значение (значение, возвращаемое хэш-функцией), hash_comp (_Key2, _Key1) равно false. Функция должна накладывать
общее упорядочение на значения типа Key.
Функция, предоставляемая hash_compare, возвращает comp (_Key2, _Key1), где comp - это сохраненный объект типа Traits, который вы можете указать при создании объекта hash_comp. Для параметра типа Черты по умолчанию меньше, ключи сортировки никогда не уменьшаются в значении.
Было легко написать класс hash_compare
для FOO
. Этот вопрос не для того, чтобы спросить, как реализовать класс. Однако для меня непросто, почему они имеют параметр черты по умолчанию less<key>
и требуют полного упорядочения.
hash_map
- это неупорядоченная структура данных. Итак, я подумал, что было бы достаточно иметь equal_to
или not_equal_to
вместо less
или greater
. Однако в описании MSDN прямо указано, что ключи упорядочены, что меня смущает.
Я неправильно понял определение hash_map
? Почему STL hash_map
действительно требуют приказы своего ключа?