c++11 标准模板(STL)(std::locale)(五)用此 locale 的 collate 刻面以字典序比较两个字符串

本文详细介绍了C++中std::locale对象如何封装文化差异,用于字典序比较字符串,以及如何管理和更改全局C++本地环境。通过例子展示了std::collate刻面和std::sort操作在不同locale下的应用。
摘要由CSDN通过智能技术生成

用以封装文化差异的多态刻面的集合


std::locale 类型对象是不可变平面的不可变索引集。 C++ 输入/输出库的每个流对象与一个 std::locale 对象关联,并用其平面分析及格式化所有数据。另外, locale 对象与每个 std::basic_regex 对象关联。 locale 对象亦可在标准容器和算法中用作进行字符串对照的谓词,而且能被直接访问,以获得或修改其所保有的平面。

C++ 程序中构造的每个 locale 至少保有下列标准平面,但程序可以定义额外特化,或全新的平面,并将它们添加到任何既存的 locale 对象。

用此 locale 的 collate 刻面以字典序比较两个字符串

std::locale::operator()
template< class CharT, class Traits, class Alloc >

bool operator()( const basic_string<CharT,Traits,Alloc>& s1,

                 const basic_string<CharT,Traits,Alloc>& s2) const;

按照此 locale 的 std::collate<charT> 平面所定义的比较规则,比较二个 string 参数 s1s2 。此运算符允许以任何拥有 collate 平面的 locale 对象为标准算法(如 std::sort )和有序容器( std::set )中的二元谓词。

参数

s1-要比较的第一字符串
s2-要比较的第二字符串

返回值

s1 按字典序小于 s2 则为 true ,否则为 false 。

可能的实现

template<class CharT, class Traits, class Alloc >
bool operator()(const std::basic_string<CharT,Traits,Alloc>& s1,
                const std::basic_string<CharT,Traits,Alloc>& s2) const;
{
    return std::use_facet<std::collate<CharT>>(*this).compare(
                                         s1.data(), s1.data() + s1.size(),
                                         s2.data(), s2.data() + s2.size()   ) < 0;
}

调用示例

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

int main()
{
    std::vector<std::wstring> vector1 = {L"жил", L"был", L"кот"};
    std::sort(vector1.begin(), vector1.end(), std::locale("Chinese (Simplified)_China.936"));
    assert(vector1[0] == L"был");
    assert(vector1[1] == L"жил");
    assert(vector1[2] == L"кот");

    assert(vector1[0] != L"был");
    assert(vector1[1] != L"жил");
    assert(vector1[2] != L"кот");

    return 0;
}

输出

Assertion failed: vector1[0] != L"был", file ..\..\qt_code\locale\main.cpp, line 17

更改全局本地环境

std::locale::global

static locale global( const locale& loc );

loc 替换全局 C++ 本地环境,这表示将来所有对 std::locale 的默认构造函数的调用将返回 loc 的副本。若 loc 拥有名称,则亦如同用 std::setlocale(LC_ALL, loc.name().c_str()); 替换 C 本地环境。此函数是修改全局 C++ 本地环境的唯一方式,否则全局 C++ 本地环境等价于程序启动时的 std::locale::classic() 。

参阅

loc-新的全局 C++ locale

返回值

全局 C++ locale 的先前值。

获得到 "C" 本地环境的引用

std::locale::classic

static const locale& classic();

获得到实现经典 "C" 本地环境语义的 C++ 本地环境的引用。此本地环境不同于全局本地环境,不能改变。

参数

(无)

返回值

返回到 "C" 本地环境的引用。

注意

一些标准要求的平面,如 UTF-8/UTF-32 转换平面 std::codecvt<char32_t, char, std::mbstate_t> ,无 "C" 本地环境中的等价版本,然而它们存在于 std::locale::classic() 返回的 locale 中,同任何其他构造于 C++ 程序中的 locale 。

调用示例

#include <locale>
#include <clocale>
#include <algorithm>
#include <vector>
#include <string>
#include <cassert>
#include <iostream>
#include <codecvt>

int main()
{
    std::locale locale1 = std::locale::classic();
    std::cout << "locale1.name():   " << locale1.name() << std::endl;

    std::locale::global(std::locale("Chinese (Simplified)_China.936"));
    std::locale locale2 = std::locale::classic();
    std::cout << "locale2.name():   " << locale2.name() << std::endl;

    return 0;
}

输出

locale1.name():   C
locale2.name():   C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值