Я смотрел на конструкторы unordered_set. Разве нельзя создать unordered_set с настраиваемым экземпляром распределителя БЕЗ установки количества хэш-сегментов? Я действительно не хотел бы возиться с деталями реализации, потому что мне нужен собственный распределитель, а тип не дает определений для значения по умолчанию. MSDN дает только три перегрузки для конструктора, ни одна из которых не очень полезна.
Редактировать: Святое дерьмо. Моя реализация STL std::hash не будет специализироваться на строках с пользовательским типом распределителя — она может выполнять только явные определения типов std::string и std::wstring. Я имею в виду, я могу понять, что не хочу пытаться хешировать случайные строки символов, но только потому, что у него есть собственный распределитель? Это вызывает у меня отвращение.
tokens(std::unordered_set<string>().bucket_count(), std::hash<string>(), std::equal_to<string>(), stl_wrapper::hash_set<string>::allocator_type(this))
template<typename Char, typename CharTraits, typename Allocator> class std::hash<std::basic_string<Char, CharTraits, Allocator>>
: public std::unary_function<std::basic_string<Char, CharTraits, Allocator>, std::size_t> {
public:
size_t operator()(const std::basic_string<Char, CharTraits, Allocator>& ref) const {
return std::hash<std::basic_string<Char, CharTraits>>()(std::basic_string<Char, CharTraits>(ref.begin(), ref.end()));
}
};
Решает проблемы, но избыточные конструкции и копирование? Фуууууу.
std::hash
немного не хватает, в частности, я думаю, что стандарт должен предоставлять функцию для хеширования последовательности байтов, чтобы упростить специализацию для UDT (включая вашу строку с настраиваемым распределителем). Но поскольку ваша альтернативно выделенная строка не связана ни с одной из обязательныхhash
специализаций, вы ДОЛЖНЫ без помощи в поле зрения. Насколько я знаю, вам просто нужно выбрать свой собственный алгоритм хеширования, а затем либо написать специализацию, либо указать хеш для своего контейнера. - person Steve Jessop   schedule 01.12.2010std::collate<charT>::hash
, так что, возможно, вы можете сделатьnamespace std { template <> struct hash<basic_string<char,char_traits<char>,MyAlloc>> { typedef size_t result_type; typedef basic_string<char,char_traits<char>,MyAlloc> argument_type; result_type operator()(const argument_type &str) { return collate<char>::hash(str.begin(), str.end()); }};}
. Это немного многословно, чтобы передать вызов... - person Steve Jessop   schedule 01.12.2010string
вместо этого будет выделяться изstd::allocator<char>
. - person Steve Jessop   schedule 01.12.2010