我们已经在C中讨论了qsort()。C++ STL提供了一种相似的函数排序,该函数对向量或数组(具有随机访问权限的项)进行排序。下面是一个简单的程序,显示sort()的工作。
// C++ program to demonstrate default behaviour of
// sort() in STL.
#include <bits/stdc++.h>
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);
cout << "\nArray after sorting using "
"default sort is:\n";
for (int i = 0; i < n; ++i)
cout << arr[i] << " ";
return 0;
}
输出:
Array after sorting using default sort is: 0 1 2 3 4 5 6 7 8 9
因此,默认情况下,sort()以升序对数组进行排序。
如何按降序排序?
sort()采用第三个参数,该参数用于指定元素的排序顺序。我们可以传递“greater()”函数以降序排序。此函数进行比较的方式是将更大的元素放在前面。
// C++ program to demonstrate descending order sort using
// greater<>().
#include <bits/stdc++.h>
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<int>());
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
如何按特定顺序排序?
我们还可以编写自己的比较器函数并将其作为第三个参数传递。这个“comparator”函数返回一个值;可转换为布尔值,本质上可以告诉我们是否应将传递的“first”参数放在传递的“second”参数之前。
例如:在下面的代码中,假设间隔{6,8}和{1,9}作为参数传递给“compareInterval”函数(比较器函数)。现在,因为i1.first(= 6)> i2.first(= 1),所以我们的函数返回“false”,这告诉我们“first”参数不应该放在“second”参数之前,因此排序将按照{1,9 },然后是{6,8}。
// A C++ program to demonstrate STL sort() using
// our own comparator
#include<bits/stdc++.h>
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]
注:本文由纯净天空筛选整理自 std::sort() in C++ STL。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。