字典排序与区域设置

时间:2019-01-21 09:38:39

标签: c++ sorting locale

如何实现正确的排序?

#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;
}

上面给出的代码没有给出正确的输出。我想使用正确处理的特殊字符(如列表初始化时给出的那样)来实现字典分类。我看了不同的帖子,但似乎都不符合我的要求。我看着the Unicode collation documentation,但是太复杂了。

编辑

在@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 

0 个答案:

没有答案