std::collate<CharT>:: hash, std::collate<CharT>:: do_hash
|
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) | |
do_hash
de la clase más derivada.
[
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
|
(C++11)
|
soporte de hash para cadenas
(especialización de plantilla de clase) |