# std::collate

< cpp‎ | locale

定义于头文件 `<locale>` |  |
template< class CharT > class collate; |  |

类 std::collate 封装字符串的本地环境限定对照（比较）和哈希。此平面为 std::basic_regex 所用，并能以 std::locale::operator() 直接应用到所有期待 string 比较谓词的标准算法。

继承图

标准库提供二个孤立（不依赖本地环境）的特化：

定义于头文件 `<locale>`
std::collate<char> | 实现字节字符串的字典序定序
std::collate<wchar_t> | 实现宽字符串的字典序定序

另外， C++ 程序中构造的每个 locale 对象都实装这些特化的其自身（本地环境限定）版本。

### 成员类型

成员类型 | 定义
`char_type` | `CharT`
`string_type` | `std::basic_string<CharT>`

### 成员函数

(构造函数) | 构造新的 collate 平面 (公开成员函数)
(析构函数) | 销毁 collate 平面 (受保护成员函数)
compare | 调用 `do_compare` (公开成员函数)
transform | 调用 `do_transform` (公开成员函数)
hash | 调用 `do_hash` (公开成员函数)

### 成员对象

static std::locale::id id | locale 的 id (公开成员对象)

### 受保护成员函数

do_compare [虚] | 用此平面的对照规则比较二个字符串 (虚受保护成员函数)
do_transform [虚] | 变换字符串，使得能用比较替换对照 (虚受保护成员函数)
do_hash [虚] | 生成使用此平面对照规则的整数哈希值 (虚受保护成员函数)

### 示例

    #include <locale>
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>

    int main()
    {
        std::wcout.imbue(std::locale(""));
        std::vector<std::wstring> v = {L"ar", L"zebra", L"\u00f6grupp", L"Zebra", L"\u00e4ngel",
                                       L"\u00e5r", L"f\u00f6rnamn"};

        std::wcout << "Default locale collation order: ";
        std::sort(v.begin(), v.end());
        for (auto s : v) std::wcout << s << ' '; std::wcout << '\n';

        std::wcout << "English locale collation order: ";
        std::sort(v.begin(), v.end(), std::locale("en_US.UTF-8"));
        for (auto s : v) std::wcout << s << ' '; std::wcout << '\n';

        std::wcout << "Swedish locale collation order: ";
        std::sort(v.begin(), v.end(), std::locale("sv_SE.UTF-8"));
        for (auto s : v) std::wcout << s << ' '; std::wcout << '\n';
    }

输出：

    Default locale collation order: Zebra ar förnamn zebra ängel år ögrupp
    English locale collation order: ängel ar år förnamn ögrupp zebra Zebra
    Swedish locale collation order: ar förnamn zebra Zebra år ängel ögrupp

### 参阅

operator() | 用此 locale 的 collate 刻面以字典序比较两个字符串 (`std::locale` 的公开成员函数)
collate_byname | 为具名 locale 创建 collate 平面 (类模板)