std::collate<CharT>::hash, std::collate<CharT>::do_hash
Определено в заголовке <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) Открытый член-функция, вызывает защищенную виртуальную член-функцию
do_hash самого производного класса.
2) Преобразует последовательность символов
[beg, end) в целочисленное значение, равное хэшу, полученному для всех строк, которые сортируются эквивалентно в данном локализованном наборе правил (compare() возвращает 0). Для двух строк, которые не сортируются эквивалентно, вероятность того, что их хэши равны, должна быть очень малой, приближающейся к 1.0 / std::numeric_limits<unsigned long>::max().Параметры
| beg | - | указатель на первый символ в последовательности для хеширования |
| end | - | указатель, следующий за концом последовательности для хеширования |
Возвращаемое значение
Значение хэша, соответствующее порядку сортировки.
Примечание
Предоставленные системой локализованные наборы правил обычно не сортируют две строки как эквивалентные (compare() не возвращает 0) если basic_string::operator== возвращает false, но установленный пользователем локализованный набор правил может предоставлять разные правила сортировки, например, он может рассматривать строки как эквивалентные, если у них одинаковая нормализованная форма Юникода.
Пример
Демонстрирует контейнер без упорядочивания, чувствительный к локализованным наборам правил.
#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';
}Возможный вывод:
Bar Foo
См. также
|
(C++11)
|
поддержка хэширования для строк (специализация шаблона класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/locale/collate/hash