c++ - 为什么 std::set 的构造函数两次比较相同的元素?
问题描述
让我们考虑以下示例:
#include <iostream>
#include <set>
struct Obj {
int x;
int operator<=> (const Obj& obj) const {
std::cout << __FUNCTION__ << " " << *this << " " << obj << std::endl;
return x - obj.x;
}
friend std::ostream& operator<< (std::ostream& os, const Obj& obj);
};
std::ostream& operator<< (std::ostream& os, const Obj& obj) {
return os << "{ x: " << obj.x << " }";
}
int main() {
std::set<Obj> st2{{1}, {2}};
return 0;
}
它将产生两行:
operator<=> { x: 1 } { x: 2 }
operator<=> { x: 2 } { x: 1 }
此刻我想知道为什么它会进行两次比较。
升级版:g++-10
版本:10.2.0
解决方案
它可能会测试它们的平等性。如果您查看std::set
的模板参数,您会发现它只需要less
提供一个函数。那么,鉴于我们只有 ,我们如何测试两个元素的相等性<
呢?比较两次。如果!less(a, b) && !less(b, a)
,那么a == b
。
推荐阅读
- scala - 在执行场景之前发送数据
- asp.net-mvc - .Net MVC - HostingEnvironment.QueueBackgroundWorkItem 的后台进程实现
- c++ - boost如何在windows上为interprocess_mutex生成一个唯一的名字
- asp.net - 在提交按钮上关闭 Jquery 移动面板
- r - 如何将 url 地址中的 xls 文件上传到 R Studio?
- docker - 如何完全删除 Docker?
- javascript - 替换标题中的文本 - 未捕获的类型错误:str.substring 不是函数
- javascript - SVG 内容从 IFrame 文档内容中消失
- video - 如何将 ATS 文件转换为 SFMOV 文件?
- c# - 如何在 Identity .net 核心中自定义 AddToRoleAsync