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

Другие вопросы по тегам