std::collate<CharT>::compare, std::collate<CharT>::do_compare

来自cppreference.com
< cpp‎ | locale‎ | collate
 
 
 
 
在标头 <locale> 定义
public:

int compare( const CharT* low1, const CharT* high1,

             const CharT* low2, const CharT* high2 ) const;
(1)
protected:

virtual int do_compare( const CharT* low1, const CharT* high1,

                        const CharT* low2, const CharT* high2 ) const;
(2)
1) 公开成员函数,调用最终派生类的受保护虚成员函数 do_compare
2) 以此本地环境的校排规则,比较字符序列 [low1high1) 与字符序列 [low2high2),而若第一字符串后随第二个则返回 1,若第一字符串前趋第二个则返回 -1,若两个字符串等价则返回零。

参数

low1 - 指向第一字符串首字符的指针
high1 - 第一字符串的尾后一位置指针
low2 - 指向第二字符串首字符的指针
high2 - 第二字符串的尾后一位置指针

返回值

若第一字符串大于第二个(即以校排顺序后随第二个)则为 1,若第一字符串小于第二个(以校排顺序前趋第二个)则为 -1,若两个字符串等价则为零。

注解

不要求三路比较时(例如在提供 Compare 参数给如 std::sort 的标准算法时),std::locale::operator() 可能更适合。

校排顺序为字典顺序:国家字母表(其等价类)中字母的位置拥有高于其大小写或变体的优先级。在等价类内,小写字符先于其大写等价物校排,而且对有变音符的字符可能应用特定于本地环境的顺序。一些本地环境中,字符组作为单个校排单元参与比较。例如,"ch" 在捷克语中后随 "h" 而前趋 "i""dzs" 在匈牙利语中后随 "dz" 而前趋 "g"

示例

#include <iostream>
#include <locale>
#include <string>
 
template<typename CharT>
void try_compare(const std::locale& l, const CharT* p1, const CharT* p2)
{
    auto& f = std::use_facet<std::collate<CharT>>(l);
 
    std::basic_string<CharT> s1(p1), s2(p2);
    if (f.compare(&s1[0], &s1[0] + s1.size(),
                  &s2[0], &s2[0] + s2.size()) < 0)
        std::wcout << p1 << " 先于 " << p2 << '\n';
    else
        std::wcout << p2 << " 先于 " << p1 << '\n';
}
 
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    std::wcout.imbue(std::locale());
 
    std::wcout << "美国本地环境中: ";
    try_compare(std::locale(), "hrnec", "chrt");
    std::wcout << "捷克本地环境中: ";
    try_compare(std::locale("cs_CZ.utf8"), "hrnec", "chrt");
 
    std::wcout << "美国本地环境中: ";
    try_compare(std::locale(), L"år", L"ängel");
    std::wcout << "瑞典本地环境中: ";
    try_compare(std::locale("sv_SE.utf8"), L"år", L"ängel");
}

输出:

美国本地环境中: chrt 先于 hrnec
捷克本地环境中: hrnec 先于 chrt
美国本地环境中: ängel 先于 år
瑞典本地环境中: år 先于 ängel

参阅

按照当前本地环境比较两个字符串
(函数)
按照当前本地环境比较两个宽字符串
(函数)
用此本地环境的校排刻面以字典序比较两个字符串
(std::locale 的公开成员函数)