首页 > 解决方案 > 具有区域设置的字典排序

问题描述

我怎样才能实现正确的排序?

#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 

标签: c++sortinglocale

解决方案


推荐阅读