📜  按降序排序 c++ stl - C++ (1)

📅  最后修改于: 2023-12-03 15:25:54.964000             🧑  作者: Mango

按降序排序 C++ STL

在 C++ STL 中,提供了许多可以对容器进行排序的算法,其中包括了按升序排序和按降序排序的方法。本文将详细介绍 C++ STL 中按降序排序的方法。

std::sort
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 
std::greater
template< class T >
struct greater;

std::greater 是一个函数对象,可以用于比较两个数的大小,返回 true 表示前者比后者大,可以和 STL 的容器一起使用,实现容器中的元素按降序排列。

以下是一个使用 std::greaterstd::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 
std::partial_sort
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 
std::nth_element
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::sortstd::partial_sort 进行部分排序时,要注意不要越界,否则会导致程序崩溃。在使用 std::nth_element 进行查找第 n 小/大元素时,要注意 nth 参数的值也不能越界。