📜  C++ STL中的std :: sort()

📅  最后修改于: 2021-05-25 19:13:29             🧑  作者: Mango

我们已经在C中讨论了qsort()。C++ STL提供了类似的函数排序,可以对向量或数组(具有随机访问权限的项)进行排序。

通常需要两个参数,第一个参数是需要从其开始排序的数组/向量的点,第二个参数是我们希望对数组/向量进行排序的长度。第三个参数是可选的,可以在诸如我们要按字典顺序对元素进行排序的情况下使用。

默认情况下,sort()函数以升序对元素进行排序。

下面是一个简单的程序,用于显示sort()的工作方式。

CPP
// C++ program to demonstrate default behaviour of
// sort() in STL.
#include 
using namespace std;
  
int main()
{
    int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    /*Here we take two parameters, the beginning of the
    array and the length n upto which we want the array to
    be sorted*/
    sort(arr, arr + n);
  
    cout << "\nArray after sorting using "
            "default sort is : \n";
    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";
  
    return 0;
}


CPP
// C++ program to demonstrate descending order sort using
// greater<>().
#include 
using namespace std;
  
int main()
{
    int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    sort(arr, arr + n, greater());
  
    cout << "Array after sorting : \n";
    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";
  
    return 0;
}


CPP
// A C++ program to demonstrate 
// STL sort() using
// our own comparator
#include 
using namespace std;
  
// An interval has a start 
// time and end time
struct Interval {
    int start, end;
};
  
// Compares two intervals 
// according to staring times.
bool compareInterval(Interval i1, Interval i2)
{
    return (i1.start < i2.start);
}
  
int main()
{
    Interval arr[]
        = { { 6, 8 }, { 1, 9 }, { 2, 4 }, { 4, 7 } };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    // sort the intervals in increasing order of
    // start time
    sort(arr, arr + n, compareInterval);
  
    cout << "Intervals sorted by start time : \n";
    for (int i = 0; i < n; i++)
        cout << "[" << arr[i].start << "," << arr[i].end
             << "] ";
  
    return 0;
}


输出 :

Array after sorting using default sort is : 
0 1 2 3 4 5 6 7 8 9 

如何按降序排序?
sort()采用第三个参数,该参数用于指定元素的排序顺序。我们可以传递“ greater()”函数以降序排列。此函数进行比较的方式是将更大的元素放在前面。

CPP

// C++ program to demonstrate descending order sort using
// greater<>().
#include 
using namespace std;
  
int main()
{
    int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    sort(arr, arr + n, greater());
  
    cout << "Array after sorting : \n";
    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";
  
    return 0;
}

输出:

Array after sorting : 
9 8 7 6 5 4 3 2 1 0 

如何按特定顺序排序?
我们还可以编写自己的比较器函数并将其作为第三个参数传递。这个“比较器”函数返回一个值;可转换为布尔值,基本上可以告诉我们是否应将传递的“第一个”参数放在传递的“第二个”参数之前。
例如:在下面的代码中,假设间隔{6,8}和{1,9}作为参数传递给“ compareInterval”函数(比较器函数)。现在,因为i1.first(= 6)> i2.first(= 1),所以我们的函数返回“ false”,这告诉我们不应将“ first”自变量放在“ second”自变量之前,因此将在其中进行排序先按{1,9}的顺序排列,然后再按{6,8}的顺序排列。

CPP

// A C++ program to demonstrate 
// STL sort() using
// our own comparator
#include 
using namespace std;
  
// An interval has a start 
// time and end time
struct Interval {
    int start, end;
};
  
// Compares two intervals 
// according to staring times.
bool compareInterval(Interval i1, Interval i2)
{
    return (i1.start < i2.start);
}
  
int main()
{
    Interval arr[]
        = { { 6, 8 }, { 1, 9 }, { 2, 4 }, { 4, 7 } };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    // sort the intervals in increasing order of
    // start time
    sort(arr, arr + n, compareInterval);
  
    cout << "Intervals sorted by start time : \n";
    for (int i = 0; i < n; i++)
        cout << "[" << arr[i].start << "," << arr[i].end
             << "] ";
  
    return 0;
}

输出:

Intervals sorted by start time : 
[1,9] [2,4] [4,7] [6,8] 
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”