簡體   English   中英

c++ STL排序的比較器function如何工作?

[英]How does comparator function of c++ STL sort work?

bool sortbysec(const pair<int,int> &a,const pair<int,int> &b) 
{ 
    return (a.second < b.second); 
} 
  

sort(vect.begin(), vect.end(), sortbysec);

vector< pair <int, int> > vect; 
  
int arr[] = {10, 17, 5, 70 }; 
int arr1[] = {30, 60, 20, 50}; 
int n = sizeof(arr)/sizeof(arr[0]); 
  
for (int i=0; i<n; i++) 
    vect.push_back( make_pair(arr[i],arr1[i]));

return(a.second<b.second) 是什么意思? 它是如何按第二個元素排序的?

抽象的有序序列s的概念是,對於任何一對元素s[i]s[j] ,當i小於j時, s[i]不大於s[j]

對序列進行排序只是重新排列序列的元素以滿足該定義。 因此,為了對元素進行排序,我們需要能夠詢問某個特定值是否小於或大於某個其他值——否則我們無法確定我們對序列的排列是否滿足“排序序列”的定義。 "

std::sort采用比較 function作為回答這個問題的方法。 默認情況下,它是std::less<T>() ,它只是使用運算符<來比較兩個元素。 通過將此 function 應用於兩個元素,它可以確定它們是否需要重新排列。 查看我們對排序序列的定義,如果當i < js[j] < s[i]則不滿足定義。 交換這兩個元素可以糾正該特定元素對的問題。

通過應用這種比較 function 以及排序算法, std::sort能夠確定要排序的序列中元素的順序。 這就是 function 所做的所有排序:它將這種比較 function 應用於元素對並重新排列它們,直到對序列進行排序。

您可以提供任何具有嚴格弱排序的比較 function fn並且std::sort將根據需要重新排列元素以確保,fn(s[i], s[j])對於所有有效索引對ij都為真,其中i > j 這允許您操作排序 function 以獲得特定訂單。 例如:

  • 如果您提供使用>運算符而不是<運算符進行比較的 function,則排序序列將按降序排列。
  • 您可以提供比較值的特定屬性的 function。 如果您有一系列struct Person { std::string name; int age; } struct Person { std::string name; int age; } struct Person { std::string name; int age; }值,你可以有一個 function 只比較年齡,這將按年齡屬性對序列進行排序。
    • 您甚至可以對多個屬性進行排序。 如果先比較age ,然后在年齡相等時比較name ,則序列將按年齡排序——但在每個年齡相等的子序列中,該子序列按姓名排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM