📅  最后修改于: 2023-12-03 15:25:54.964000             🧑  作者: Mango
在 C++ STL 中,提供了许多可以对容器进行排序的算法,其中包括了按升序排序和按降序排序的方法。本文将详细介绍 C++ STL 中按降序排序的方法。
template< class RandomIt >
void sort( RandomIt first, RandomIt last, Compare comp );
std::sort
是 C++ STL 中用于排序的最基本的算法之一,可以对任何 RandomAccessIterator 指向的区间进行排序。其第三个参数是一个可调用对象,用于指定排序的方式,默认为升序排序。
如果想进行降序排序,可以使用一个 lambda 表达式作为 comp
参数,返回 true
表示前者比后者小,否则返回 false
。
以下是一个对 int 数组进行降序排序的示例代码:
#include <iostream>
#include <algorithm>
int main() {
int arr[] = {5, 2, 9, 3, 7};
int n = sizeof(arr) / sizeof(arr[0]);
std::sort(arr, arr + n, [](int a, int b) {
return a > b;
});
for (int i = 0; i < n; i++) {
std::cout << arr[i] << ' ';
}
std::cout << std::endl;
return 0;
}
输出:
9 7 5 3 2
template< class T >
struct greater;
std::greater
是一个函数对象,可以用于比较两个数的大小,返回 true
表示前者比后者大,可以和 STL 的容器一起使用,实现容器中的元素按降序排列。
以下是一个使用 std::greater
和 std::set
进行降序排序的示例代码:
#include <iostream>
#include <set>
#include <functional>
int main() {
std::set<int, std::greater<int>> s;
s.insert(5);
s.insert(2);
s.insert(9);
s.insert(3);
s.insert(7);
for (auto it = s.begin(); it != s.end(); it++) {
std::cout << *it << ' ';
}
std::cout << std::endl;
return 0;
}
输出:
9 7 5 3 2
template< class RandomIt >
void partial_sort( RandomIt first, RandomIt middle, RandomIt last, Compare comp );
std::partial_sort
是 C++ STL 中用于进行部分排序的算法之一,可以对任何 RandomAccessIterator 指向的区间进行部分排序。其第四个参数也是一个可调用对象,用于指定排序的方式,默认为升序排序。
如果想进行降序排序,可以使用一个 lambda 表达式作为 comp
参数,返回 true
表示前者比后者小,否则返回 false
。
以下是一个对 int 数组进行部分降序排序的示例代码:
#include <iostream>
#include <algorithm>
int main() {
int arr[] = {5, 2, 9, 3, 7};
int n = sizeof(arr) / sizeof(arr[0]);
std::partial_sort(arr, arr + 3, arr + n, [](int a, int b) {
return a > b;
});
for (int i = 0; i < 3; i++) {
std::cout << arr[i] << ' ';
}
std::cout << std::endl;
return 0;
}
输出:
9 7 5
template< class RandomIt >
void nth_element( RandomIt first, RandomIt nth, RandomIt last, Compare comp );
std::nth_element
是 C++ STL 中用于查找第 n 小/大元素的算法之一,可以对任何 RandomAccessIterator 指向的区间进行查找。其第四个参数也是一个可调用对象,用于指定排序的方式,默认为升序排序。
如果想查找第 n 大的元素,可以使用一个 lambda 表达式作为 comp
参数,返回 true
表示前者比后者小,否则返回 false
。
以下是一个对 int 数组进行查找第 3 大元素的示例代码:
#include <iostream>
#include <algorithm>
int main() {
int arr[] = {5, 2, 9, 3, 7};
int n = sizeof(arr) / sizeof(arr[0]);
std::nth_element(arr, arr + 2, arr + n, [](int a, int b) {
return a > b;
});
std::cout << arr[2] << std::endl;
return 0;
}
输出:
5
以上就是 C++ STL 中按降序排序的方法的详细介绍。需要注意的是,在使用 std::sort
和 std::partial_sort
进行部分排序时,要注意不要越界,否则会导致程序崩溃。在使用 std::nth_element
进行查找第 n 小/大元素时,要注意 nth
参数的值也不能越界。