我們已經在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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。