c++11 标准模板(STL)本地化库 - 平面类别(std::collate) - 定义字典序比较和字符串的散列(二)

本地化库

本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C++ 标准库的其他组件的行为。

平面类别

定义字典序比较和字符串的散列

std::collate

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

继承图

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

定义于头文件 <locale>

std::collate<char>实现字节字符串的字典序定序
std::collate<wchar_t>实现宽字符串的字典序定序

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

成员类型

成员类型定义
char_typeCharT
string_typestd::basic_string<CharT>

 

构造新的 collate 平面

std::collate<CharT>::collate

explicit collate( std::size_t refs = 0 );

创建 std::collate 平面并转发引用计数 refs 到基类构造函数 locale::facet::facet() 。

参数

refs-开始的引用计数

销毁 collate 平面

std::collate<CharT>::~collate

protected: ~collate();

析构 std::collate 平面。此析构函数为受保护且为虚(由于基类析构函数为虚)。 std::collate 类型对象,同大多数平面,只能在最后一个实装此平面的 std::locale 离开作用域时,或若用户定义导出自 std::collate 并实现公开构造函数,才会被销毁。

示例

#include <iostream>
#include <locale>struct Destructible_collate : public std::collate<wchar_t>
{Destructible_collate(std::size_t refs = 0) : collate(refs) {}// 注意:隐式析构函数为公开
};int main()
{Destructible_collate dc;// std::collate<wchar_t> c;  // 编译错误:受保护析构函数return 0;
}

调用 do_compare & 用此平面的对照规则比较二个字符串

std::collate<CharT>::compare, 
std::collate<CharT>::do_compare
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) 以此本地环境的对照规则,比较字符序列 [low1, high1) 与字符序列 [low2, high2) ,而若第一字符串后随第二个则返回 1 ,若第一字符串前趋第二个则返回 -1 ,若二个字符串等价则返回零。

参数

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

返回值

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

注意

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

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

 

调用示例 linux

#include <iostream>
#include <string>
#include <locale>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 << " before " << p2 << '\n';}else{std::wcout << p2 << " before " << p1 << '\n';}
}int main()
{std::locale::global(std::locale("en_US.utf8"));std::wcout.imbue(std::locale());std::wcout << "In the American locale: ";try_compare(std::locale(), "hrnec", "chrt");std::wcout << "In the Czech locale: ";try_compare(std::locale("cs_CZ.utf8"), "hrnec", "chrt");std::wcout << "In the American locale: ";try_compare(std::locale(), L"år", L"ängel");std::wcout << "In the Swedish locale: ";try_compare(std::locale("sv_SE.utf8"), L"år", L"ängel");return 0;
}

输出

In American locale: chrt before hrnec
In the Czech locale: hrnec before chrt
In the American locale: ängel before år
In the Swedish locale: år before ängel

调用示例 window

#include <locale>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <Windows.h>std::vector<std::wstring> locals;BOOL CALLBACK MyFuncLocaleEx(LPWSTR pStr, DWORD dwFlags, LPARAM lparam)
{locals.push_back(pStr);return TRUE;
}std::string stows(const std::wstring& ws)
{std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";setlocale(LC_ALL, "chs");const wchar_t* _Source = ws.c_str();size_t _Dsize = 2 * ws.size() + 1;char *_Dest = new char[_Dsize];memset(_Dest, 0, _Dsize);wcstombs(_Dest, _Source, _Dsize);std::string result = _Dest;delete[]_Dest;setlocale(LC_ALL, curLocale.c_str());return result;
}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 << " before " << p2 << std::endl;}else{std::wcout << p2 << " before " << p1 << std::endl;}
}int main()
{EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALTERNATE_SORTS, NULL, NULL);for (std::vector<std::wstring>::const_iterator strIt = locals.begin();strIt != locals.end(); ++strIt){std::wcout << "In the " << *strIt << " locale: ";try_compare(std::locale(stows(*strIt)), L"år", L"ängel");}return 0;
}

输出

In the de-DE_phoneb locale: 鋘gel before 錼
In the es-ES_tradnl locale: 鋘gel before 錼
In the hu-HU_technl locale: 錼 before 鋘gel
In the ja-JP_radstr locale: 鋘gel before 錼
In the ka-GE_modern locale: 鋘gel before 錼
In the x-IV_mathan locale: 鋘gel before 錼
In the zh-CN_phoneb locale: 鋘gel before 錼
In the zh-CN_stroke locale: 鋘gel before 錼
In the zh-HK_radstr locale: 鋘gel before 錼
In the zh-MO_radstr locale: 鋘gel before 錼
In the zh-MO_stroke locale: 鋘gel before 錼
In the zh-SG_phoneb locale: 鋘gel before 錼
In the zh-SG_stroke locale: 鋘gel before 錼
In the zh-TW_pronun locale: 鋘gel before 錼
In the zh-TW_radstr locale: 鋘gel before 錼

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636228.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

clickhouse学习笔记04

ClickHouse高可用之ReplicatedMergeTree引擎介绍 ClickHouse高可用架构准备-环境说明和ZK搭建 RPM安装ClickHouse 上传我们的clickhouse rpm文件。 安装&#xff1a; 中途需要输入用户名和密码 可以不设置 直接回车。 启动&#xff1a; 查看状态&#xff1a; 查看端口是否占用…

区间图着色问题:贪心算法设计及实现

区间图着色问题&#xff1a;贪心算法设计及实现 1. 问题定义2. 贪心算法设计2.1 活动排序2.2 分配教室2.3 算法终止 3. 伪代码4. C语言实现5. 算法分析6. 结论7. 参考文献 在本文中&#xff0c;我们将探讨如何使用贪心算法解决一个特定的资源分配问题&#xff0c;即区间图着色问…

常用的数据结构及算法

一、数据结构 &#xff08;一&#xff09;线性结构&#xff1a;一对一。 1.可以使用数组、链表来表示。数组又分为静态数组和动态数组两种。链表常用的是单链表。 2.两种特殊的线性结构&#xff1a;队列和栈。其中队列是先进先出&#xff08;排队&#xff09;&#xff0c;栈…

Delphi Firemonkey使用TVertScrollbox自定义列表数据

界面布局设置如下 创建一个过程添加新项目 procedure TForm1.AddItem(name: string; age: Integer); varlayout: TLayout; begin// 设置姓名标签的文本Label3.Text : name;// 设置年龄标签的文本Label4.Text : IntToStr(age);// 克隆 Layout1&#xff0c;并将克隆得到的对象赋值…

删除链表的中间节点

题目链接 删除链表的中间节点 题目描述 注意点 链表中节点的数目在范围 [1, 100000] 内 解答思路 快慢指针找到链表中间节点的前一个节点&#xff0c;慢指针每次跳一格&#xff0c;快指针每次跳两格&#xff0c;当快指针跳到链表末尾时&#xff0c;此时慢指针刚好到链表的…

在PostgreSQL中如何有效地批量导入大量数据,并确保数据加载过程中的性能和稳定性?

文章目录 解决方案1. 使用COPY命令2. 调整配置参数3. 禁用索引和约束4. 使用事务5. 并发导入 总结 在PostgreSQL中&#xff0c;批量导入大量数据是一个常见的需求&#xff0c;特别是在数据迁移、数据仓库填充或大数据分析等场景中。为了确保数据加载过程中的性能和稳定性&#…

【java解决线程间变量不可见性的方案】

解决线程间变量不可见性的方案 一、 背景 所有的实例变量和类变量都存储在主内存&#xff0c;但每个线程都有自己的工作内存&#xff0c;保留了主内存的共享变量的副本&#xff0c;线程修改的是共享变量&#xff0c;但是每个线程每次只能读取工作内存里的值&#xff0c;所以会…

WAF攻防-信息收集识别被动探针代理池仿指纹白名单

知识点 0、WAF介绍&模式&识别&防护等 1、信息收集-被动扫描&第三方接口 2、信息收集-基于爬虫&文件目录探针 3、信息收集-基于用户&代理池&白名单章节点 WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制…

图像处理的魔法师:Pillow 库探秘

文章目录 图像处理的魔法师&#xff1a;Pillow 库探秘第一部分&#xff1a;背景介绍第二部分&#xff1a;库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解…

【Day 3】Ajax + Vue 项目、路由 + Nginx

1 Ajax Asynchronous JavaScript And XML 异步的 JavaScript 和 XML 作用&#xff1a; 数据交换 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据 异步交互 可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术&#xf…

代码随想录 797. 所有可能的路径

题目 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节点 graph[i][j]存在一…

【R语言】混合图:小提琴图+箱线图

{ggstatsplot} 是 {ggplot2} 包的扩展&#xff0c;用于创建图形&#xff0c;其中包含信息丰富的绘图本身中包含的统计测试的详细信息。在典型的探索性数据分析工作流程中&#xff0c;数据可视化和统计建模是两个不同的阶段&#xff1a;可视化通知建模&#xff0c;而建模又可以建…