25 Localization library [localization]

25.4 Standard locale categories [locale.categories]

25.4.4 The collate category [category.collate]

25.4.4.1 Class template collate [locale.collate]

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

Каждая функция сравнивает строку символов *p в диапазоне [low, high).

25.4.4.1.1 collate members [locale.collate.members]

int compare(const charT* low1, const charT* high1, const charT* low2, const charT* high2) const;

Returns: do_­compare(low1, high1, low2, high2).

string_type transform(const charT* low, const charT* high) const;

Returns: do_­transform(low, high).

long hash(const charT* low, const charT* high) const;

Returns: do_­hash(low, high).

25.4.4.1.2 collate virtual functions [locale.collate.virtuals]

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;

Returns: basic_­string<charT> Значение , которое, по сравнению с лексикографическим результатом вызова transform() на другую строку, дает тот же результат , как вызов do_­compare() на те же двух строк.242

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

Эта функция полезна, когда одна строка сравнивается со многими другими строками.