std::collate<CharT>:: hash, std::collate<CharT>:: do_hash
|
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) | |
do_hash
de la classe la plus dérivée.
[
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
|
(C++11)
|
prise en charge du hachage pour les chaînes de caractères
(spécialisation de modèle de classe) |