命名空间
变体
操作

std::collate<CharT>::hash, std::collate<CharT>::do_hash

来自 cppreference.com
< cpp‎ | locale‎ | collate
 
 
 
 
在头文件 <locale> 中定义
public:
long hash( const CharT* beg, const CharT* end ) const;
(1)
protected:
virtual long do_hash( const CharT* beg, const CharT* end ) const;
(2)
1) 公共成员函数,调用最派生类的受保护的虚拟成员函数 do_hash
2) 将字符序列 [begend) 转换为一个整数值,该值等于在该语言环境中与所有排序等效的字符串获得的散列值(compare() 返回 0)。对于两个排序不等效的字符串,它们的散列值相等的概率应该非常小,接近 1.0 / std::numeric_limits<unsigned long>::max().

内容

[编辑] 参数

beg - 指向要散列的序列中第一个字符的指针
end - 指向要散列的序列的末尾指针的下一个

[编辑] 返回值

尊重排序顺序的散列值。

[编辑] 注意

系统提供的语言环境通常不会将两个字符串排序为等效的 (compare() 不会返回 0),如果 basic_string::operator== 返回 false,但用户安装的 std::collate 方面可能会提供不同的排序规则,例如,它可能会将字符串视为等效的,如果它们具有相同的 Unicode 规范化形式。

[编辑] 示例

演示一个语言环境感知的无序容器。

#include <iostream>
#include <locale>
#include <string>
#include <unordered_set>
 
struct CollateHash
{
    template<typename CharT>
    long operator()(const std::basic_string<CharT>& s) const
    {
        return std::use_facet<std::collate<CharT>>(std::locale()).hash(
                   &s[0], &s[0] + s.size()
               );
    }
};
struct CollateEq
{
    template<typename CharT>
    bool operator()(const std::basic_string<CharT>& s1,
                    const std::basic_string<CharT>& s2) const
    {
        return std::use_facet<std::collate<CharT>>(std::locale()).compare(
                     &s1[0], &s1[0] + s1.size(),
                     &s2[0], &s2[0] + s2.size()
               ) == 0;
    }
};
 
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    std::wcout.imbue(std::locale());
 
    std::unordered_set<std::wstring, CollateHash, CollateEq> s2 = {L"Foo", L"Bar"};
    for (auto& str : s2)
        std::wcout << str << ' ';
    std::cout << '\n';
}

可能的输出

Bar Foo

[编辑] 参见

字符串的散列支持
(类模板特化) [编辑]