如何创建自定义拼贴器

How to create a custom collator?

本文关键字:自定义 创建 何创建      更新时间:2023-10-16

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

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"。

原因是collator忽略了空格和字符串,比如:

a pencil
an apple

将被视为:

apencil
anapple

如果排序,将按以下顺序出现:

an apple
a pencil

但我想要:

a pencil
an apple

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

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

这只是意味着您的自定义collator类将有一个collator成员,它将使用该成员来帮助执行排序,而不是从collate类派生。

至于你的比较规则,似乎你需要明确地实现你自己的逻辑。如果你不想忽略空格,也许你应该标记你的字符串。