如何实现正确的排序?
#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