std::collate

来自cppreference.com
< cpp‎ | locale
定义于头文件 <locale>
template< class CharT >
class collate;

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

cpp/locale/locale/facetstd-collate-inheritance.svg

继承图

标准库提供二个孤立(不依赖本地环境)的特化:

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

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

成员类型

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

成员函数

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

成员对象

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

受保护成员函数

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

示例

#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

参阅

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