Почему следует
#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==
в функциональных объектах, как упоминалось Вот ?
operator==
это не проблема, потому что это уже определено в стандартной библиотеке.
Тем не менее, хэш-функция должна быть адаптирована из std::hash
специализация для std::u16string
предоставляется стандартной библиотекой, которая будет работать для std::unordered_*
контейнеры, но не Boost’s.
Одним из решений может быть определение функции хеширования следующим образом:
std::size_t hash_value(std::u16string const &s) {
return std::hash<std::u16string>{}(s);
}
Эта оболочка предоставит вам уже написанную логику, которая будет хорошо работать с Boost.
Наконец, позвольте мне напомнить вам о наличии эквивалентного std::unordered_set
контейнер в стандартной библиотеке C ++ 11, на случай, если вы не знали об этом.
Других решений пока нет …