名前空間
変種
操作

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

From 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を返します)。照合順序が等価でない2つの文字列について、それらのハッシュが等しくなる確率は非常に小さく、1.0 / std::numeric_limits<unsigned long>::max()に近づくはずです。

目次

[編集] パラメータ

beg - ハッシュするシーケンスの最初の文字へのポインタ
end - ハッシュするシーケンスの末尾の次のポインタ

[編集] 戻り値

照合順序を尊重するハッシュ値。

[編集] 注記

システム提供のロケールは、通常、2つの文字列を等価として照合しません(compare()0を返さない)が、ユーザーがインストールした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

[編集] 関連項目

文字列のハッシュサポート
(クラステンプレートの特殊化) [編集]
English 日本語 中文(简体) 中文(繁體)