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_function
和 operator==
?
operator==
不用担心,因为它已经在标准库中定义了。
但是,散列函数必须从标准库提供的 std::u16string
的 std::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
容器,以防您不知道它。
为什么关注
#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_function
和 operator==
?
operator==
不用担心,因为它已经在标准库中定义了。
但是,散列函数必须从标准库提供的 std::u16string
的 std::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
容器,以防您不知道它。