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;
    };
}
The class
collate<charT>
provides features for use in the
collation (comparison) and hashing of strings
.  A locale member function template,
operator(),
uses the collate facet to allow a locale to act directly as the predicate
argument for standard algorithms (
[algorithms]) and containers operating on strings
.  Each function compares a string of characters
*p
in the range
[
low, high)
.