std::collate<CharT>:: hash, std::collate<CharT>:: do_hash
|
Definiert im Header
<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) | |
do_hash
der am stärksten abgeleiteten Klasse auf.
[
beg
,
end
)
in einen ganzzahligen Wert um, der dem Hash entspricht, der für alle Zeichenketten erhalten wird, die in dieser Locale äquivalent sortieren (
compare()
gibt
0
zurück). Für zwei Zeichenketten, die nicht äquivalent sortieren, sollte die Wahrscheinlichkeit, dass ihre Hashes gleich sind, sehr gering sein und sich
1.0
/
std::
numeric_limits
<
unsigned
long
>
::
max
(
)
annähern.
Inhaltsverzeichnis |
Parameter
| beg | - | Zeiger auf das erste Zeichen in der zu hashenden Sequenz |
| end | - | Zeiger auf das Ende (eins hinter dem letzten Zeichen) der zu hashenden Sequenz |
Rückgabewert
Der Hash-Wert, der die Sortierreihenfolge berücksichtigt.
Hinweis
Die systemseitig bereitgestellten Locales behandeln normalerweise zwei Zeichenketten nicht als äquivalent ( compare() gibt nicht 0 zurück) wenn basic_string::operator== false zurückgibt, aber eine benutzerdefinierte std::collate Facette kann abweichende Sortierregeln bereitstellen, zum Beispiel könnte sie Zeichenketten als äquivalent behandeln, wenn sie dieselbe Unicode-normalisierte Form besitzen.
Beispiel
Demonstriert einen lokalisierungsbewussten ungeordneten Container.
#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'; }
Mögliche Ausgabe:
Bar Foo
Siehe auch
|
(C++11)
|
Hash-Unterstützung für Strings
(Klassen-Template-Spezialisierung) |