boost::unordered_set 个字符串,共 char16_t 个字符串

boost::unordered_set of char16_t strings

为什么关注

#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;
}

另外,请问有什么解决办法?我是否需要在 here 提到的函数对象中编写自己的 hash_functionoperator==

operator== 不用担心,因为它已经在标准库中定义了。 但是,散列函数必须从标准库提供的 std::u16stringstd::hash 专业化改编而来,它适用于 std::unordered_* 容器,但不适用于 Boost 的容器。

一种解决方案可能是按以下方式定义散列函数:

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

这个包装器将为您提供一个已经编写好的逻辑,可以很好地与 Boost 一起工作。

最后,让我提醒您 C++11 标准库中提供了等效的 std::unordered_set 容器,以防您不知道它。