2015-10-03 2 views
1

Почему следующиеповышение :: unordered_set из char16_t строк

#include <string> 
#include <boost/unordered_set.hpp> 

int main() 
{  
    typedef boost::unordered_set<std::string> unordered_set; 
    unordered_set animals; 

    animals.emplace("cat"); 
    animals.emplace("shark"); 
    animals.emplace("spider"); 
    return 0; 
} 

работы и следующие результаты в слишком много ошибок компиляции.

#include <string> 
#include <boost/unordered_set.hpp> 

int main() 
{  
    typedef boost::unordered_set<std::u16string> unordered_set; 
    unordered_set animals; 

    animals.emplace("cat"); 
    animals.emplace("shark"); 
    animals.emplace("spider"); 
    return 0; 
} 

Кроме того, что это за решение? Должен ли я написать свои собственные hash_function и operator== в функциональных объектах, как упомянуто here?

ответ

1

operator== не вызывает беспокойства, поскольку он уже определен в стандартной библиотеке. Однако хеш-функцию необходимо адаптировать из std::hash специализации для std::u16string, предоставляемой стандартной библиотекой, которая будет работать для контейнеров std::unordered_*, но не для Boost.

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

std::size_t hash_value(std::u16string const &s) { 
    return std::hash<std::u16string>{}(s); 
} 

Эта обертка поможет вам уже написанную логику, завернутые в хорошо работать с Boost.

Наконец, позвольте мне напомнить вам о наличии эквивалентного контейнера std::unordered_set в стандартной библиотеке C++ 11, если вы об этом не знали.