namespace std { template <class charT> class collate : public locale::facet { public: using char_type = charT; using string_type = basic_string<charT>; explicit collate(size_t refs = 0); int compare(const charT* low1, const charT* high1, const charT* low2, const charT* high2) const; string_type transform(const charT* low, const charT* high) const; long hash(const charT* low, const charT* high) const; static locale::id id; protected: ~collate(); virtual int do_compare(const charT* low1, const charT* high1, const charT* low2, const charT* high2) const; virtual string_type do_transform(const charT* low, const charT* high) const; virtual long do_hash (const charT* low, const charT* high) const; }; }
Класс collate<charT> предоставляет функции для использования при сопоставлении (сравнении) и хешировании строк. Шаблон функции-члена языкового стандарта operator()использует фасет сопоставления, чтобы языковой стандарт действовал непосредственно в качестве аргумента предиката для стандартных алгоритмов (пункт [algorithms]) и контейнеров, работающих со строками. Применяются специализации, требуемые в таблице 69 ([locale.category]), а именно collate<char> и .collate<wchar_t> lexicographic ordering
int compare(const charT* low1, const charT* high1,
const charT* low2, const charT* high2) const;
string_type transform(const charT* low, const charT* high) const;
long hash(const charT* low, const charT* high) const;
int do_compare(const charT* low1, const charT* high1,
const charT* low2, const charT* high2) const;
Returns: 1 если первая строка больше второй, -1 если меньше, в противном случае ноль. Специализации, требуемые в Table 69 ([locale.category]), а именно collate<char> и collate<wchar_t>, реализуют lexicographical comparison.
string_type do_transform(const charT* low, const charT* high) const;
long do_hash(const charT* low, const charT* high) const;
Returns: Целочисленное значение, равное результату вызова hash() любой другой строки, для которой do_compare() возвращается 0 (равно) при передаче двух строк. [ Note: Вероятность того, что результат такой же, как у другой строки, которая не сравнивается с равной, должна быть очень маленькой, приближающейся (1.0/numeric_limits<unsigned long>::max()). ] — end note
Эта функция полезна, когда одна строка сравнивается со многими другими строками.