存在"等价",以便"comp"满足比较要求
Existence of `equiv` for the Compare requirement to be satisfied by a `comp`
在名为 Compare 的C++命名要求中,列出了一组名为comp
和equiv
的两个操作的属性。特别是,有一个将两者联系起来
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)
不是函数。 它只是一个逻辑构造,用于指定类型必须持有哪些条件才能满足比较要求。
也就是说,对于名为comp
的T
类型的对象,想象一个名为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
必须指定严格的弱排序,但它本身不满足比较要求。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 智能指针作为无序映射键,并通过引用进行比较
- 比较if语句中的数组值和int值
- 对于循环变体比较
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 比较两个大小不等的映射c++