std::set 使用 boost::iequals 进行自定义字符串比较
以下代码运行良好,没有问题,但想知道是否可以使用 boost::iequals 重写自定义比较运算符,该运算符可以在不转换为上位的情况下进行比较。
std::string copyToUpper(std::string s)
{
std::transform(s.begin(),s.end(),s.begin(),::toupper);
return s;
}
struct caseInsensitiveCompare {
bool operator() (const std::string& a, const std::string& b) const {
return (copyToUpper(a).compare(copyToUpper(b)) < 0);
}
};
std::set<std::string, caseInsensitiveCompare> keys;
Following code works well without issues but wondering, if it is possible to rewrite custom comparison operator using boost::iequals , which compares without converting to upper.
std::string copyToUpper(std::string s)
{
std::transform(s.begin(),s.end(),s.begin(),::toupper);
return s;
}
struct caseInsensitiveCompare {
bool operator() (const std::string& a, const std::string& b) const {
return (copyToUpper(a).compare(copyToUpper(b)) < 0);
}
};
std::set<std::string, caseInsensitiveCompare> keys;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我会像这样定义一个比较器:
然后您可以将它与您选择的数据结构一起使用:
Live On Compiler Explorer
打印
I would define a comparator like this:
Then you can use it with your datastructure of choice:
Live On Compiler Explorer
Prints
几乎所有 STL 容器都依赖于严格的弱排序。因此,比较函数需要返回的不是字符串是否彼此相等,而是字符串中的一个“小于”另一个。但是 boost::iequals 检查相等,如果一个字符串比另一个字符串“小”,则不相等,因此不能将它用于映射、集合或排序函数的比较器。
Almost all STL containers rely on strict weak ordering. So the comparison function needs to return, not whether the strings are equal to each other, but that one is "less" than the other. But boost::iequals checks for equality and not if one string is "less" than the other, so you can't use it for the comparator of a map, a set or a sort function.