如何创建自定义整理器?
How to create a custom collator?
我正在使用以下代码作为对字符串列表进行排序的函数:
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 做了这个,解决方案是创建一个自定义整理器。但是在 C++ 中我该如何处理呢?
尝试创建您自己的整理器 class 或比较函数。虽然在 Java 中,更惯用的方法可能是通过扩展来实现,但在 C++ 中,对于你的情况,我建议使用组合。
这只是意味着您的自定义整理器 class 将有一个整理器成员,它将用于帮助它执行整理,而不是从 collate
class 派生。
至于你的比较规则,看来你需要显式实现你自己的逻辑。如果您不想忽略空格,也许您应该标记化您的字符串。
我正在使用以下代码作为对字符串列表进行排序的函数:
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 做了这个,解决方案是创建一个自定义整理器。但是在 C++ 中我该如何处理呢?
尝试创建您自己的整理器 class 或比较函数。虽然在 Java 中,更惯用的方法可能是通过扩展来实现,但在 C++ 中,对于你的情况,我建议使用组合。
这只是意味着您的自定义整理器 class 将有一个整理器成员,它将用于帮助它执行整理,而不是从 collate
class 派生。
至于你的比较规则,看来你需要显式实现你自己的逻辑。如果您不想忽略空格,也许您应该标记化您的字符串。