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

devtools/2024/9/20 3:54:45/ 标签: c++, 平面, 标准库模板, STL, locale, collate

本地化库

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

平面类别

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

std::collate

template< class CharT >
class 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>

调用 do_transform & 变换字符串,使得能用比较替换对照

std::collate<CharT>::transform, 
std::collate<CharT>::do_transform

 

public:
string_type transform( const CharT* low, const CharT* high ) const;

(1)

protected:
virtual string_type do_transform( const CharT* low, const CharT* high ) const;

(2)

1) 公开成员函数,调用最终导出类的受保护虚成员函数 do_transform

2) 转换字符序列 [low, high) 为 string ,使得它与在另一字符串上调用 transform() 的结果以字典序比较,会产生在二个相同字符串上调用 do_compare() 的相同结果。

参数

low-指向要变换的字符序列中首字符的指针
high-要变换的序列的尾后一位置指针

返回值

变换后的字符串,它使得被变换字符串的字典序比较能用于取代原字符串的对照。 "C" 本地环境中,返回的字符串为 [low, high) 的准确副本。其他本地环境中,返回字符串的内容是实现定义的,而且可考虑到大小可能更长。

注意

在对照中的使用外,被变换字符串的本地环境限定格式还为 std::regex_traits::transform_primary 所知,它能释出等价类信息。

调用示例 linux 

#include <iostream>
#include <iomanip>
#include <locale>int main()
{std::locale::global(std::locale("sv_SE.utf8"));auto& f = std::use_facet<std::collate<wchar_t>>(std::locale());std::wstring in1 = L"\u00e4ngel";std::wstring in2 = L"\u00e5r";std::wstring out1 = f.transform(&in1[0], &in1[0] + in1.size());std::wstring out2 = f.transform(&in2[0], &in2[0] + in2.size());std::wcout << "In the Swedish locale: ";if (out1 < out2){std::wcout << in1 << " before " << in2 << std::endl;}else{std::wcout << in2 << " before " << in1 << std::endl;}std::wcout << "In lexicographic comparison: ";if (in1 < in2){std::wcout << in1 << " before " << in2 << std::endl;}else{std::wcout << in2 << " before " << in1 << std::endl;}return 0;
}

输出

In the Swedish locale: år before ängel
In lexicographic comparison: ängel before år

调用示例 windows

#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;
}int main()
{EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALTERNATE_SORTS, NULL, NULL);for (std::vector<std::wstring>::const_iterator strIt = locals.begin();strIt != locals.end(); ++strIt){std::locale::global(std::locale(stows(*strIt)));auto& f = std::use_facet<std::collate<wchar_t>>(std::locale());std::wstring in1 = L"\u00e4ngel";std::wstring in2 = L"\u00e5r";std::wstring out1 = f.transform(&in1[0], &in1[0] + in1.size());std::wstring out2 = f.transform(&in2[0], &in2[0] + in2.size());std::wcout << "In the " << *strIt << " locale: ";if (out1 < out2){std::wcout << in1 << " before " << in2 << std::endl;}else{std::wcout << in2 << " before " << in1 << std::endl;}std::wcout << "In lexicographic comparison: ";if (in1 < in2){std::wcout << in1 << " before " << in2 << std::endl;}else{std::wcout << in2 << " before " << in1 << std::endl;}}return 0;
}

输出

In the de-DE_phoneb locale: ?ngel before ?r
In lexicographic comparison: ?ngel before ?r
In the es-ES_tradnl locale: ?ngel before ?r
In lexicographic comparison: ?ngel before ?r
In the hu-HU_technl locale: ar before ?ngel
In lexicographic comparison: ?ngel before ar
In the ja-JP_radstr locale: angel before ar
In lexicographic comparison: angel before ar
In the ka-GE_modern locale:


http://www.ppmy.cn/devtools/6592.html

相关文章

东岸科技将赴港IPO,冲刺催收第一股

来源 | 镭射财经&#xff08;leishecaijing&#xff09; 「镭射财经」独家获悉&#xff0c;东岸科技即将开启IPO&#xff0c;向港交所递交上市申请。计划上市的为公司科技板块&#xff0c;拟募集资金主要用于不良资产管理数字化创新。 今年3月&#xff0c;东岸科技董事长朱铁…

数据结构习题--杨辉三角形(返回某一行)

数据结构习题–杨辉三角形(返回某一行) 输入需要第几行&#xff0c;返回杨辉三角形中的这一行 注意&#xff1a;这里的行数是从0开始 方法&#xff1a;递推(复杂度行数的平方) 分析&#xff1a; 当处于每行的第一个和最后一个时&#xff0c;添加的数为1 除此之外&#xff0…

MacOS 文件句柄数不够 Error: EMFILE: too many open files

MacOS 文件句柄数不够 Error: EMFILE: too many open files 直奔主题-解决方案 启动项目发现报错&#xff1a;Error: EMFILE: too many open files&#xff1b;经排查是因为单个微应用项目较大&#xff0c;发布过程中已经超过了mac默认的文件监听上限对文件系统进行大量并发调用…

Tomcat命令行窗口、IDEA中Tomcat控制台 中文乱码问题解决方案

Tomcat出现中文乱码问题 打开Tomcat文件夹下的conf/logging.properties文件&#xff0c;将下图位置中的编码由UTF-8全部替换成GBK 然后重启Tomcat服务器&#xff0c;问题解决 Intellij IDEA启动Tomcat服务器控制台出现中文乱码 解决方案非常简单&#xff0c;按照下图设置控制…

代码随想录系统性一刷总结

代码随想录系统性一刷总结 数组 指针思想很重要 day01 二分查找移除元素 day02 数组平方长度最小子数组螺旋矩阵II 链表 链表结点的增删改查&#xff0c;头结点的运用&#xff0c;灵活运用指针 day03 移除链表元素设计链表翻转链表 day04 交换结点删除结点链表相交环形列表 …

uni-app学习记录

uni-app 基础 uni-app环境搭建 命令行搭建 基础使用差异说明 要使用滚动 <scroll-view scroll-y"true" class"h-600">类似于v-html <rich-text nodes"<h1>1123213</h1>" /> <editor /> - text-area生命周期…

【JavaWeb】Day47.Mybatis基础操作——删除

Mybatis基础操作 需求 准备数据库表 emp 创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09; application.properties中引入数据库连接信息 创建对应的实体类 Emp&#xff08;实体类属性采用驼峰命名&#xf…

Python数据可视化库—Bokeh与Altair指南

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在数据科学和数据分析领域&#xff0c;数据可视化是一种强大的工具&#xff0c;可以帮助我们…

​面试经典150题——翻转二叉树

1. 题目描述 2. 题目分析与解析 分析题目可以看出&#xff0c;其实就是从下到上的左右节点互换操作&#xff0c;其实上也是可以进行递归操作的&#xff0c;这是因为每一个子操作和父操作都是一样的方式。 解题思路&#xff1a; 空树情况处理&#xff1a; 首先检查根节点是否…

聊聊linux的文件缓存

序 本文主要研究一下linux的文件缓存 文件缓存 linux使用page cache来缓存最近读取的文件&#xff0c;也有目录结构(dcache: Directory Entry Cache)缓存及inode缓存&#xff0c;它们都使用了LRU算法来管理这些page及dentries cache vmstat ## vmstat procs -----------me…

【数据结构2-线性表】

数据结构2-线性表 1 线性表-数组2 线性表-单链式结构2.1 前插顺序单链表2.2 后插顺序单链表2.3 循环单链表2.4 双向链表 总结 线性表、栈、队列、串和数组都属于线性结构。 线性结构的基本特点是除第一个元素无直接前驱&#xff0c;最后一个元素无直接后继之外&#xff0c;其他…

【C++】日期类Date(详解)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 日期类 日期类实现地图 获取某年某月的天数&#xff1a;GetMonthDay 检查日期合法&#xff0c;构造函数&#xff0c;拷贝构造函数&#xff0c;赋值运算符重载及析构函数…

【运维】docker-compose部署redis

部署Redis使用docker-compose是一种简便且流行的方式。以下是基本的docker-compose.yml文件示例&#xff0c;用于部署单节点Redis服务 方案一 直接使用docker安装单机版 创建.env环境文件并配置管理密码 echo REDIS_PWDredis123456 > .env创建docker-compose.yml环境文件…

【C语言】每日一题,快速提升(8)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;金字塔图案 输入&#xff1a; 4输出&#xff1a; * * * * * * * * * * 代码&#xff1a; //对于有行有列的图形采用双循环&#xff0c;i控制行…

算法课程笔记——集合set

3复杂度不稳定 删一个和删除全部 注意iter是类 遍历是无序的

保护视力,从 CareUEyes 开始 —— 你的电脑护眼小助手

在数字化时代&#xff0c;我们的眼睛比以往任何时候都更频繁地面对屏幕。长时间盯着电脑工作&#xff0c;不仅影响视力&#xff0c;还可能导致眼疲劳和不适。今天&#xff0c;我要向大家推荐一款专为电脑用户设计的护眼软件——CareUEyes。 CareUEyes&#xff1a;你的视力守护者…

【Linux开发 第六篇】Linux常用命令知识

常用命令知识 关机和重启用户管理用户组运行级别帮助指令文件目录类时间日期类搜索查找类压缩和解压类 关机和重启 shutdown -h now //立刻进行关机 shutdown -h 1 “1分钟后进行” //一分钟后进行关机 并向登录Linux的各个用户发送字符串 shutdown -r now //现在重新启动…

最新在线工具箱网站系统源码

最新在线工具箱网站系统源码 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89080638 更多资源下载&#xff1a;关注我。

关于FastJson转换map集合为json字符串解析时格式出错的问题

在Java中使用Fastjson将包含Map类型key的Map集合转换为String时&#xff0c;如果直接使用Fastjson的JSON.toJSONString()方法&#xff0c;可能会因为JavaScript的安全性限制&#xff08;例如对象的key必须是字符串&#xff09;而在前端JavaScript解析时出现问题。 因为当 转换时…

最大子数组和(贪心)

53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 样例输入 示例…