1

为什么会关注

#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==

4

1 回答 1

1

operator==不是问题,因为它已经在标准库中定义。但是,哈希函数必须从标准库提供的std::hash专门化中进行调整std::u16string,这将适用于std::unordered_*容器,但不适用于 Boost 的容器。

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

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

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

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

于 2015-10-03T08:58:19.063 回答