最近在寫一個算法的時候,把一些數據存在了pair中,並且需要根據pair中first或者second的值對這些數據進行排序。比如:輸入數據(1,2)、(4,2)、(3,3)、(2,1)根據first的值大小進行升序排序,輸出(1,2)、(2,1)、(3,3)、(4,2)。
經過思索之后得到的實現方法如下:
首先將這些數據存在vector數組中,vector<pair<int,int>>vec;
然后使用sort函數對數組進行排序,這里就涉及到了sort函數的使用了。
下面是sort函數使用方法
函數聲明:
template <class RandomAccessIterator> void stable_sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare> void stable_sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
參數解釋:
(1)第一個是要排序的數組的起始地址。
(2)第二個是結束的地址(最后一位要排序的地址的下一地址)。
(3)第三個參數是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個參數,此時默認的排序方法是從小到大排序。
我們可以根據自己的需求自定義第三個參數cmp函數,比如若要對整型數組降序排序,則可以這樣來寫cmp函數:
bool cmp(int a, int b) { return a>b;//升序則為a<b }
這個cmp參數使用起來非常方便,因為它正好能解決我們的pair排序問題。
我們只要根據數組中的元素類型定義cmp函數的參數,並且根據需求定義函數體
bool cmp(pair<int, int>a, pair<int, int>b) { return a.first<b.first;//根據fisrt的值升序排序 //return a.second<b.second;//根據second的值升序排序 }
然后調用sort函數sort(vec.begin(),vec.end(),cmp)。
便可以根據pair中first的值進行升序排序。
下面是具體代碼實現
#include "stdafx.h" #include <iostream> #include <vector> #include<algorithm> using namespace std; //根據first的值升序排序 bool cmp1(pair<int,int>a,pair<int,int>b) { return a.first < b.first; } //根據second的值升序排序 bool cmp2(pair<int, int>a, pair<int, int>b) { return a.second < b.second; } int main() { vector<pair<int, int>>vec; vec.push_back({ 1,2 }); vec.push_back({ 4,2 }); vec.push_back({ 3,3 }); vec.push_back({ 2,1 }); sort(vec.begin(), vec.end(), cmp1); cout << "根據first的值升序排序:" << endl; for (auto it = vec.begin();it != vec.end();it++) { cout << "(" << it->first << "," << it->second << ")" << endl; } sort(vec.begin(), vec.end(), cmp2); cout << "根據second的值升序排序:" << endl; for (auto it = vec.begin();it != vec.end();it++) { cout << "(" << it->first << "," << it->second << ")" << endl; } }
運行截圖