存在"等价",以便"comp"满足比较要求

Existence of `equiv` for the Compare requirement to be satisfied by a `comp`

本文关键字:quot 比较 满足 等价 存在 以便 comp      更新时间:2023-10-16

在名为 Compare 的C++命名要求中,列出了一组名为compequiv的两个操作的属性。特别是,有一个将两者联系起来

equiv(a, b), an expression equivalent to !comp(a, b) && !comp(b, a)

问:我应该如何阅读此要求?特别是此类操作的存在。

为什么会有这个问题?严格阅读该要求似乎意味着,对于满足比较T类型的方法comp,需要存在相应的方法equiv以便满足上述条件。

现在,以下代码编译并运行

#include <iostream>
#include <vector>
#include <algorithm>
class A
{
public:
int x;
double y;
A(int x, double y) : x(x), y(y) {};
bool operator<(A& other)
{
return (x < other.x) || (x == other.x && y < other.y);
};
};
int main()
{
A a1(1, 3.14);
A a2(2, 2.71);
//std::cout << "a1 == a2 = " << (a1 == a2) << std::endl; // Un-commenting this line produces compilation error.
std::vector<A> v{A(1,1.0), A(2,2.43535), A(5433, 0.5343456), A(-1,34), A(1,4.45435)};
for (auto elem : v)
{
std::cout << "(" << elem.x << "," << elem.y << ") ";
}
std::cout << std::endl;
std::sort(v.begin(), v.end());
for (auto elem : v)
{
std::cout << "(" << elem.x << "," << elem.y << ") ";
};
std::cout << std::endl;
return 0;
}

打印v,按词典顺序对矢量进行排序并按顺序打印。

这意味着,我假设编译器发现A::operator<满足比较。

但是,通过取消注释掉注释的行获得的编译错误表明A没有定义相应的equiv

我是否对要求的理解过于严格?或者在这种情况下可能有equiv,但不是A::operator==.

该要求中的equiv(a, b)不是函数。 它只是一个逻辑构造,用于指定类型必须持有哪些条件才能满足比较要求。

也就是说,对于名为compT类型的对象,想象一个名为equiv的函数,它等效于表达式!comp(a, b) && !comp(b, a)。 该假设函数必须满足概述的要求,但它实际上并不是一个存在的东西。 它只是作为指定comp必须如何行为的一种方式而提供的。


请注意,在您的示例中,A::operator<本身不符合比较要求(A::operator<(a, b)格式不正确(。std::sort实际使用的是std::less<A>,它使用表达式a < b进行实际比较。 要使std::less<A>满足比较要求,表达式的行为a < b必须指定严格的弱排序,但它本身不满足比较要求。