Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | locale‎ | collate
 
 
 
 
 
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 [begend) 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.

#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

Hash-Unterstützung für Strings
(Klassentemplate-Spezialisierung) [bearbeiten]