Лексикографическая сортировка с настройками локали - PullRequest
0 голосов
/ 21 января 2019

Как мне добиться правильной сортировки?

#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 
...