Namespaces
Variants

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

From cppreference.net
Definido en el encabezado <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) Función miembro pública, llama a la función miembro virtual protegida do_hash de la clase más derivada.
2) Convierte la secuencia de caracteres [ beg , end ) a un valor entero que es igual al hash obtenido para todas las cadenas que se comparan equivalentes en esta configuración regional ( compare() devuelve 0 ). Para dos cadenas que no se comparan equivalentes, la probabilidad de que sus hashes sean iguales debería ser muy pequeña, aproximándose a 1.0 / std:: numeric_limits < unsigned long > :: max ( ) .

Contenidos

Parámetros

beg - puntero al primer carácter en la secuencia a hashear
end - puntero una posición después del final para la secuencia a hashear

Valor de retorno

El valor hash que respeta el orden de intercalación.

Nota

Las configuraciones regionales proporcionadas por el sistema normalmente no consideran equivalentes dos cadenas ( compare() no devuelve 0 ) si basic_string::operator== devuelve false , pero una faceta std::collate instalada por el usuario puede proporcionar reglas de ordenación diferentes, por ejemplo, puede tratar las cadenas como equivalentes si tienen la misma forma normalizada Unicode.

Ejemplo

Demuestra un contenedor no ordenado consciente de la configuración regional.

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

Salida posible:

Bar Foo

Véase también

soporte de hash para cadenas
(especialización de plantilla de clase)