三向比较符又称太空飞船操作符,可以用来确定一个值和另外一个值的大小关系,返回枚举类型,定义在<compare>头文件中。
例1:
int n1{ 10 };
int n2{ 20 };
auto result = n1 <=> n2;
if (std::strong_ordering::less == result) //判断n1是否小于n2
{
cout << "n1 < n2" << endl;
}
if (std::strong_ordering::greater == result) //判断n1是否大于n2
{
cout << "n1 > n2" << endl;
}
if (std::strong_ordering::equal == result) //判断n1是否等于n2
{
cout << "n1 = n2" << endl;
}
if (std::strong_ordering::equivalent == result) //判断n1是有与n2等价
{
cout << "n1 == n2" << endl;
}
//输出结果:n1<n2
result的类型为一个名为std::strong_ordering的枚举类型,因为n1 n2均为int,则该比较的结果为强排序,其中equal意为相等,equivalent意为等价,在strong ordering类型下这两个意思相同,以下是这两个值得源码定义:
…
enum class _Compare_eq : _Compare_t { equal = 0, equivalent = equal };
…
inline constexpr strong_ordering strong_ordering::equal{static_cast<_Compare_t>(_Compare_eq::equal)};
inline constexpr strong_ordering strong_ordering::equivalent{static_cast<_Compare_t>(_Compare_eq::equivalent)};
…
可见在源码层次,这两个值是完全一样的。
例2:
如果比较的类型是浮点型,那么返回的结果就是partial ordering
double n1{ 10 };
double n2{ 20 };
auto result = n1 <=> n2;
if (std::partial_ordering::less == result) //判断n1是否小于n2
{
cout << "n1 < n2" << endl;
}
if (std::partial_ordering::greater == result) //判断n1是否大于n2
{
cout << "n1 > n2" << endl;
}
if (std::partial_ordering::equivalent == result) //判断n1是否等于n2
{
cout << "n1 = n2" << endl;
}
if (std::partial_ordering::unordered == result) //
{
cout << "n1 or n2 is unordered" << endl;
}
//输出结果:n1<n2
例3:
对于自定义类型重载<=>我们需要弱排序weak_ordering
import <iostream>;
import <string>;
import <compare>;
using namespace std;
class testWeakOrdering
{
public:
testWeakOrdering(int value):m_value(value)
{
}
std::weak_ordering operator<=> (const testWeakOrdering& other)
{
if (m_value < other.m_value)
{
return weak_ordering::less;
}
else if (m_value == other.m_value)
{
return weak_ordering::equivalent;
}
else
{
return weak_ordering::greater;
}
}
private:
int m_value;
};
int main()
{
testWeakOrdering n1{ 10 };
testWeakOrdering n2{ 20 };
auto result = n1 <=> n2;
if (std::weak_ordering::less == result) //判断n1是否小于n2
{
cout << "n1 < n2" << endl;
}
if (std::weak_ordering::greater == result) //判断n1是否大于n2
{
cout << "n1 > n2" << endl;
}
if (std::weak_ordering::equivalent == result) //判断n1是否等于n2
{
cout << "n1 = n2" << endl;
}
return 0;
}