boost :: 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== в функциональных объектах, как упоминалось Вот ?

1

Решение

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, на случай, если вы не знали об этом.

1

Другие решения

Других решений пока нет …