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, однако установленная пользователем фасета std::collate может предоставлять другие правила сортировки. Например, она может считать строки эквивалентными, если они имеют одинаковую нормализованную форму Unicode.
Пример
Демонстрирует неупорядоченный контейнер с учётом локали.
#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/cpp/locale/collate/hash