c++ - 具有区域设置的字典排序
问题描述
我怎样才能实现正确的排序?
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
inline bool sort_string_swiss(std::string const& a, std::string const& b){
return std::use_facet<std::collate<char> >(std::locale("fr_CH.UTF-8")).compare(&a[0], &a[0] + a.size(), &b[0], &b[0] + b.size())<0;
}
int main(){
std::vector<std::string> list{"De rien", "Décider","Devant"};
std::cout<<"Correct: ";
for(auto const& l:list){ std::cout<<l<<" "; } //outputs De rien Décider Devant
std::sort(list.begin(),list.end(),sort_string_swiss);
std::cout<<std::endl<<"Not correct: ";
for(auto const& l:list){ std::cout<<l<<" "; } //outputs Décider De rien Devant
std::sort(list.begin(),list.end());
std::cout<<std::endl<<"Not correct: ";
for(auto const& l:list){ std::cout<<l<<" "; } //outputs De rien Devant Décider
std::cout<<std::endl;
}
上面给出的代码没有给出正确的输出。我想用正确处理的特殊字符来实现字典排序(在初始化列表时给出)。我查看了不同的帖子,但似乎没有一个符合我的要求。我查看了 Unicode 整理文档,但它太复杂了。
编辑
在@darune的建议之后,我添加了
std::setlocale(LC_ALL, "fr_CH.UTF-8");
和
inline bool sort_string_strcoll(std::string const& a, std::string const& b){
return std::strcoll(&a[0],&b[0])<0;
}
但
std::sort(list.begin(),list.end(),sort_string_strcoll);
std::cout<<std::endl<<"Not correct: ";
for(auto const& l:list){ std::cout<<l<<" "; } //outputs Décider De rien Devant
解决方案
推荐阅读
- .htaccess - 如何从子域中删除文件夹名称
- c# - 当关系应该是隐式的时,如何避免显式定义泛型类型参数?
- c++ - filter2D 实现的差异
- android - 如何将位图保存到内部存储?
- sql-server - 如何为 SQL Server 数据的多个获取请求设置 API 服务器?
- php - Magento 1.9 中的 Ajax cart pro 扩展冲突
- google-bigquery - 在 Bigquery 中使用“计划查询”时如何避免重复数据
- ruby-on-rails - 将粉碎合并到现有的 Rails 应用程序中
- angular - 如何检测 Angular 7 中的 url 变化包括参数和查询参数
- php - PHP HTML表格设置在x列之后的列旁边