我正在使用以下代码作为函数来对字符串列表进行排序:

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。但是,字符串“as”在“a”之前,我要“a”然后是“as”。

原因是整理程序会忽略空格和字符串,例如:
a pencil
an apple

将被视为:
apencil
anapple

并且如果排序,将按以下顺序显示:
an apple
a pencil

但是我想要:
a pencil
an apple

我使用Java做到了这一点,解决方案是创建一个自定义整理器。但是在c++中我该如何处理呢?

最佳答案

尝试创建自己的整理器类或比较函数。虽然在Java中,更惯用的方法可能是通过扩展来实现,但是在c++中,对于您的情况,我建议您使用composition。

这只是意味着您的自定义排序规则类将具有一个排序规则成员,该成员将用于帮助其执行排序规则,而不是从collate类派生。

至于比较规则,似乎需要显式实现自己的逻辑。如果您不希望空格被忽略,也许您应该对字符串进行标记化。

10-07 23:45