我使用以下代码作为函数来对字符串列表进行排序:
bool stringLessThan(const string& str1, const string& str2)
{
const collate<char>& col = use_facet<collate<char> >(locale()); // Use the global locale
string s1(str1);
string s2(str2);
transform(s1.begin(), s1.end(), s1.begin(), ::tolower);
transform(s2.begin(), s2.end(), s2.begin(), ::tolower);
const char* pb1 = s1.data();
const char* pb2 = s2.data();
return (col.compare(pb1, pb1 + s1.size(), pb2, pb2 + s2.size()) < 0);
}
我将全局区域设置为:
locale::global(locale("pt_BR.UTF-8"));
如果我使用en_EN.UTF-8
语言环境,那么带有我的语言口音(葡萄牙语 - 巴西语)的单词将按我想要的顺序排列。所以我使用pt_BR.UTF-8
。但是,字符串&#34; as&#34;是在&#34; a&#34;之前,我想&#34; a&#34;然后&#34; as&#34;。
原因是collator忽略了空格和字符串,如:
a pencil
an apple
将被视为:
apencil
anapple
如果已排序,将按此顺序显示:
an apple
a pencil
但我想:
a pencil
an apple
我用Java制作了这个,解决方案是创建一个自定义整理器。但是在c ++中我该怎么处理呢?
答案 0 :(得分:2)
尝试创建自己的collator类或比较函数。虽然在Java中,通过扩展来实现这一目标可能更为惯用,在c ++中,对于您的情况,我建议使用合成。
这只是意味着您的自定义collator类将拥有一个collator成员,它将用于帮助它执行整理,而不是从collate
类派生。
至于你的比较规则,似乎你需要明确地实现自己的逻辑。如果你不想忽略空格,也许你应该对你的字符串进行标记。