首页 > 解决方案 > 为什么 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

标签: c++stdc++20

解决方案


它可能会测试它们的平等性。如果您查看std::set的模板参数,您会发现它只需要less提供一个函数。那么,鉴于我们只有 ,我们如何测试两个元素的相等性<呢?比较两次。如果!less(a, b) && !less(b, a),那么a == b


推荐阅读