gpt4 book ai didi

c++ - 存在 `equiv` 以通过 `comp` 满足比较要求

转载 作者:行者123 更新时间:2023-11-28 01:17:13 25 4
gpt4 key购买 nike

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

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

问题:我应该如何阅读这个要求?特别是这种操作的存在。

为什么这个问题?严格阅读要求似乎意味着对于满足比较的类型 comp 的方法 T 需要存在相应的方法 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 ,按词典顺序对 vector 进行排序并按顺序打印。

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

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

我是不是看要求太严了?或者在这种情况下可能有一个 equiv,但它不是 A::operator==

最佳答案

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

也就是说,对于 T 类型的对象名为 comp ,想象一个名为 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必须指定严格的弱排序,但它本身不满足比较要求。

关于c++ - 存在 `equiv` 以通过 `comp` 满足比较要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58291833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com