std::collate<CharT>::hash, std::collate<CharT>::do_hash
From cppreference.com
| ヘッダー <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) 文字シーケンス
[beg, end)を、このロケールで照合順序が等価なすべての文字列に対して得られるハッシュと等しい整数値に変換します(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
[編集] 関連項目
| (C++11) |
文字列のハッシュサポート (クラステンプレートの特殊化) |