std::collate<CharT>::hash, std::collate<CharT>::do_hash
Von cppreference.com
| Definiert in 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) | |
1) Öffentliche Memberfunktion, die die geschützte virtuelle Memberfunktion
do_hash der am meisten abgeleiteten Klasse aufruft.2) Konvertiert die Zeichensequenz
[beg, end) in einen ganzzahligen Wert, der gleich dem Hash ist, der für alle Zeichenfolgen erhalten wird, die in dieser Locale äquivalent sortiert sind (compare() gibt 0 zurück). Für zwei Zeichenfolgen, die nicht äquivalent sortiert sind, sollte die Wahrscheinlichkeit, dass ihre Hashes gleich sind, sehr gering sein und sich 1.0 / std::numeric_limits<unsigned long>::max() annähern.Inhalt |
[bearbeiten] Parameter
| beg | - | Zeiger auf das erste Zeichen in der zu hashenden Sequenz |
| end | - | Zeiger auf das Ende der zu hashenden Sequenz (exklusiv) |
[bearbeiten] Rückgabewert
Der Hash-Wert, der die Sortierreihenfolge berücksichtigt.
[bearbeiten] Hinweis
Die vom System bereitgestellten Locales sortieren normalerweise zwei Zeichenfolgen nicht als äquivalent (compare() gibt nicht 0 zurück), wenn basic_string::operator== false zurückgibt. Eine benutzerdefinierte std::collate-Facet kann jedoch andere Sortierregeln bereitstellen, z. B. kann sie Zeichenfolgen als äquivalent behandeln, wenn sie die gleiche Unicode-Normalform haben.
[bearbeiten] Beispiel
Demonstriert einen Locale-fähigen ungeordneten Container.
Führen Sie diesen Code aus
#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
[bearbeiten] Siehe auch
| (C++11) |
Hash-Unterstützung für Strings (Klassentemplate-Spezialisierung) |