C++20中头文件compare的使用

      <compare>是C++20中新增加的头文件,此头文件是language support库的一部分。它包括:concepts、classes、customization point objects、functions。

      1.concepts:三向比较运算符<=>,目的是简化比对对象的过程,支持所有六种关系运算符(==、!=、>、>=、<、<=),返回表示比较结果的枚举值,这个枚举值可以被用来决定两个对象是否相等、小于或大于另一个对象,详细介绍参考:https://blog.csdn.net/fengbingchun/article/details/140078283  ,测试代码如下:所有std::cout都会输出

namespace {
auto compare = []<typename T>(const T & x, const T & y) {
	return x <=> y;
};

struct Point {
	int x, y;
	
	auto operator<=>(const Point& other) const = default;
};

const std::string str1{ "abc" }, str2{ "Abc" }, str3{ "abc" };

template<class Ord>
void print_cmp_type()
{
	if constexpr (std::is_same_v<Ord, std::strong_ordering>)
		std::cout << "strong ordering\n";
	else if constexpr (std::is_same_v<Ord, std::weak_ordering>)
		std::cout << "weak ordering\n";
	else if constexpr (std::is_same_v<Ord, std::partial_ordering>)
		std::cout << "partial ordering\n";
	else
		std::cout << "illegal comparison result type\n";
}

} // namespace

int test_compare_concepts()
{
	constexpr auto x{ 1 }, y{ 2 }, z{ 1 };
	if (compare(x, y) < 0) std::cout << x << " < " << y << std::endl;
	if (compare(y, x) > 0) std::cout << y << " > " << x << std::endl;
	if (compare(x, z) == 0) std::cout << x << " == " << z << std::endl;

	if (compare(str2, str1) < 0) std::cout << str2 << " < " << str1 << std::endl;
	if (compare(str1, str2) > 0) std::cout << str1 << " > " << str2 << std::endl;
	if (compare(str1, str3) == 0) std::cout << str1 << " == " << str3 << std::endl;

	return 0;
}

      2.classes:

      三向比较的结果类型:枚举值,支持所有六种关系运算符(==, !=, <, <=, >, >=)

      类std::strong_ordering:有4种有效值:less、equal、equivalent、greater。

      类std::weak_ordering:有3种有效值:less、equivalent、greater。

      类std::partial_ordering:有4种有效值:less、equivalent、greater、unordered。

      std::compare_three_way:执行三向比较,一般不直接调用。

      std::compare_three_way_result:三向比较运算符的结果类型。

int test_compare_classes()
{
	if (compare(str2, str1) == std::strong_ordering::less) std::cout << str2 << " < " << str1 << std::endl;
	if (compare(str1, str2) == std::strong_ordering::greater) std::cout << str1 << " > " << str2 << std::endl;
	if (compare(str1, str3) == std::strong_ordering::equal) std::cout << str1 << " == " << str3 << std::endl;

	constexpr float x{ 1.f }, y{ 2.f }, z{ 1.f };
	if (compare(x, y) == std::weak_ordering::less) std::cout << x << " < " << y << std::endl;
	if (compare(y, x) == std::weak_ordering::greater) std::cout << y << " > " << x << std::endl;
	if (compare(x, z) == std::weak_ordering::equivalent) std::cout << x << " == " << z << std::endl;

	constexpr Point p1{ 1,2 }, p2{ 2,3 };
	auto ret = p1 <=> p2;
	if (ret == std::partial_ordering::less) std::cout << "p1 < p2" << std::endl;
	if (std::compare_three_way{}(p1, p2) == std::strong_ordering::less) std::cout << "p1 < p2" << std::endl;

	print_cmp_type<std::compare_three_way_result_t<int>>(); // strong ordering
	print_cmp_type<std::compare_three_way_result_t<double>>(); // partial ordering

	return 0;
}

      执行结果如下图所示:

      3.customization point objects:

      std::strong_order:执行三向比较并生成std::strong_ordering类型的结果。

      std::weak_order:执行三向比较并生成std::weak_ordering类型的结果。

      std::partial_order:执行三向比较并生成std::partial_ordering类型的结果。

      std::compare_strong_order_fallback:执行三向比较并生成std::strong_ordering类型的结果,即使运算符<=>不可用

      std::compare_weak_order_fallback:执行三向比较并生成std::weak_ordering类型的结果,即使运算符<=>不可用。

      std::compare_partial_order_fallback:执行三向比较并生成std::partial_ordering类型的结果,即使运算符<=>不可用。

     测试代码如下,所有std::cout都会输出

int test_compare_customization_point_objects()
{
	if (std::strong_order(str1, str2) == std::strong_ordering::greater) std::cout << str1 << " > " << str2 << std::endl;
	if (std::weak_order(str2, str1) == std::weak_ordering::less) std::cout << str2 << " < " << str1 << std::endl;
	if (std::partial_order(str1, str3) == std::partial_ordering::equivalent) std::cout << str1 << " == " << str3 << std::endl;

	if (std::compare_strong_order_fallback(str1, str2) == std::strong_ordering::greater) std::cout << str1 << " > " << str2 << std::endl;
	if (std::compare_weak_order_fallback(str2, str1) == std::weak_ordering::less) std::cout << str2 << " < " << str1 << std::endl;
	if (std::compare_partial_order_fallback(str1, str3) == std::partial_ordering::equivalent) std::cout << str1 << " == " << str3 << std::endl;

	return 0;
}

      4.functions:std::is_eq、std::is_neq、std::is_lt、std::is_lteq、std::is_gt、std::is_gteq,比较函数,这些函数将三向比较的结果转换为六个关系运算符之一的结果,依次为==、!=、<、<=、>、>=。

      测试代码如下,所有std::cout都会输出

int test_compare_functions()
{
	if (std::is_eq(std::strong_order(str1, str3))) std::cout << str1 << " == " << str3 << std::endl;
	if (std::is_neq(std::strong_order(str1, str2))) std::cout << str1 << " != " << str2 << std::endl;

	if (std::is_lt(std::weak_order(str2, str1))) std::cout << str2 << " < " << str1 << std::endl;
	if (std::is_lteq(std::weak_order(str2, str1))) std::cout << str2 << " <= " << str1 << std::endl;

	if (std::is_gt(std::partial_order(str1, str2))) std::cout << str1 << " > " << str2 << std::endl;
	if (std::is_gteq(std::partial_order(str1, str3))) std::cout << str1 << " >= " << str3 << std::endl;

	return 0;
}

      GitHub:https://github.com/fengbingchun/Messy_Test

<think>好的,我现在需要回答用户关于C++中sort函数所需的头文件的问题。首先,我要确认自己对这个问题的理解是否正确。用户明确询问的是sort函数在C++中需要包含哪个头文件,所以我的回答需要直接明确这一点。 我记得在C++的标准库中,sort函数属于算法库的一部分,应该是在<algorithm>头文件中。不过,为了确保正确性,我应该查阅相关的资料或者参考用户提供的引用内容。用户提供了三个引用,我需要仔细查看这些引用中的信息。 查看引用[1],里面提到:“sort函数包含在头文件为#include<algorithm>的c++标准库中”。引用[2]的示例代码中包含了#include<algorithm>,并且使用了sort函数。引用[3]同样指出:“sort函数包含在头文件为#include<algorithm>的c++标准库中”。这三个引用都一致说明头文件是<algorithm>,所以可以确定答案是正确的。 接下来,我需要组织回答的结构。用户的问题比较直接,所以回答应该简洁明了。首先直接给出头文件的名称,然后补充一些相关信息,比如是否需要命名空间std,或者使用时需要注意的地方。例如,sort函数位于std命名空间下,因此需要using namespace std;或者显式使用std::sort。 此外,用户提供的引用中还提到sort函数的参数和用法,比如第三个参数是比较函数,默认是升序排序。虽然用户没有直接问这些,但可能可以作为补充信息,帮助用户更好地理解sort函数的使用,或者为后续相关问题做准备。 需要确保回答符合用户的要求:结构清晰,分步解决问题,真实可靠。同时,根据用户提供的系统级指令,需要使用中文回答,正确使用LaTeX格式,生成相关问题,并在引用处添加标识。 现在需要检查是否有其他可能的头文件,比如早期的C++版本或者其他库是否有不同的情况,但根据标准C++库,sort确实在<algorithm>中,所以无需考虑其他可能性。 总结回答步骤: 1. 直接回答头文件是<algorithm>。 2. 说明需要包含该头文件,并且通常使用using namespace std;或者在调用时使用std::sort。 3. 提供简单的示例代码,展示如何包含头文件使用sort函数。 4. 引用用户提供的参考资料,添加引用标识。 5. 生成相关问题,如参数用法、自定义排序方法等。 现在需要确保示例代码的正确性。例如,用户引用中的例子包含了头文件<algorithm>,并且使用sort(a, a+10)来排序数组。但需要注意,在C++中,变长数组(如int a[n])并不是标准C++的一部分,只有在C99或某些编译器扩展中支持。不过这可能不是用户当前问题的重点,所以示例代码可能需要调整,或者说明这一点。不过用户的问题仅关注头文件,所以示例中的这一点可能可以忽略,或者简单提及。 最后生成相关问题,应该围绕sort函数的使用、参数、优化、应用场景等,比如如何自定义比较函数、sort函数的时间复杂度、与qsort的区别等。</think>C++中`sort`函数需要包含的头文件是$<algorithm>$。使用时需在代码开头添加以下语句: ```cpp #include <algorithm> ``` 该函数属于标准命名空间`std`,因此需配合`using namespace std;`声明,或直接通过`std::sort`调用[^1][^3]。 ### 示例代码 ```cpp #include <iostream> #include <algorithm> // 必须包含的头文件 using namespace std; int main() { int arr[] = {5, 2, 8, 3, 1}; sort(arr, arr + 5); // 默认升序排序 return 0; } ``` ### 补充说明 - **默认行为**:若不提供比较函数,`sort`按升序排列元素[^2]。 - **自定义排序**:可通过第三个参数定义比较逻辑,例如: ```cpp bool compare(int a, int b) { return a > b; } sort(arr, arr + 5, compare); // 降序排序 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值