std::collate<CharT>::compare, std::collate<CharT>::do_compare
来自cppreference.com
在标头 <locale> 定义
|
||
public: int compare( const CharT* low1, const CharT* high1, |
(1) | |
protected: virtual int do_compare( const CharT* low1, const CharT* high1, |
(2) | |
1) 公开成员函数,调用最终派生类的受保护虚成员函数
do_compare
。2) 以此本地环境的校排规则,比较字符序列
[
low1,
high1)
与字符序列 [
low2,
high2)
,而若第一字符串后随第二个则返回 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 的公开成员函数) |