Namespaces
Variants

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

From cppreference.net
Défini dans l'en-tête <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) Fonction membre publique, appelle la fonction membre virtuelle protégée do_hash de la classe la plus dérivée.
2) Convertit la séquence de caractères [ beg , end ) en une valeur entière égale au hachage obtenu pour toutes les chaînes qui sont équivalentes selon les règles de collation de cette locale ( compare() renvoie 0 ). Pour deux chaînes qui ne sont pas équivalentes selon les règles de collation, la probabilité que leurs hachages soient égaux devrait être très faible, approchant 1.0 / std:: numeric_limits < unsigned long > :: max ( ) .

Table des matières

Paramètres

beg - pointeur vers le premier caractère de la séquence à hacher
end - pointeur juste après la fin de la séquence à hacher

Valeur de retour

La valeur de hachage qui respecte l'ordre de classement.

Note

Les paramètres régionaux fournis par le système ne considèrent normalement pas deux chaînes comme équivalentes ( compare() ne retourne pas 0 ) si basic_string::operator== retourne false , mais une facette std::collate installée par l'utilisateur peut fournir des règles de collationnement différentes, par exemple, elle peut traiter les chaînes comme équivalentes si elles ont la même forme normalisée Unicode.

Exemple

Démontre un conteneur non ordonné prenant en compte les paramètres régionaux.

#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';
}

Sortie possible :

Bar Foo

Voir aussi

prise en charge du hachage pour les chaînes de caractères
(spécialisation de modèle de classe)