我试图弄清楚如何在没有警告/错误的情况下编译以下代码。
这是我在项目中看到的一段代码,我正在办公室工作。 (变量/类名已更改)
ArrayList
我检查了ClassA的源代码,我没有看到任何比较器正在实现。那么只有一对中的第一个元素需要比较器吗?
编辑:ClassA的所有实例都来自同一个向量。
答案 0 :(得分:5)
ClassA
可能没有operator<
,但这并不重要,因为您在ClassA*
中存储了ClassA
,而不是ClassA as [10];
as[0] < as[1]; //invalid, compares ClassAs
as < as+1; //valid, compares ClassA*s
。您可以比较指针,因此您的代码可以正常工作。
createsale.php
请注意,您需要非常小心比较的语义。你真的想要比较那些指针吗?他们指向同一个数组对象吗?如果没有,一旦你比较它们,你就会进入一个充满乐趣的未定义行为的乐趣之地。如果是这样,那个顺序可能仍然不是你想要的那个。
答案 1 :(得分:3)
您的理解不正确。 std::pair
定义operator<
。它按字典顺序进行比较,即仅在第一个元素相等时才比较第二个元素。
确切的标准(n4606):
template <class T1, class T2>
constexpr bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y)
返回:
x.first < y.first || (!(y.first < x.first) && x.second < y.second)
。
这种情况有点特殊,因为将指针与不属于同一对象/数组的对象进行比较是未定义的。