C++ STL排序的比较器函数如何工作?

cod*_*_10 7 c++ sorting stl

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]));
Run Code Online (Sandbox Code Playgroud)

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

cdh*_*wie 7

抽象的排序序列的概念s是,对于任何一对元素s[i]s[j],当小于时s[i],不大于。s[j]ij

对序列进行排序只是重新排列序列的元素以满足此定义。因此,为了对元素进行排序,我们需要能够询问特定值是否小于或大于其他值 - 否则我们无法确定我们对序列的排列满足“排序序列”的定义。 ”

std::sort使用比较函数来回答这个问题。默认情况下,它std::less<T>()只是使用运算符<来比较两个元素。通过将此函数应用于两个元素,它可以确定它们是否需要重新排列。看看我们对排序序列的定义,如果s[j] < s[i]何时i < j则不满足定义。交换这两个元素可以纠正该特定元素对的问题。

通过应用此比较函数以及排序算法, std::sort能够确定要排序的序列中元素应采用的顺序。这就是排序函数所做的全部工作:它将比较函数应用于元素对并重新排列它们,直到序列排序完毕。

您可以提供任何fn具有严格弱排序的比较函数,并将std::sort根据需要重新排列元素,以确保!fn(s[i], s[j])对于所有有效索引对ijwhere都是如此i > j。这允许您操纵排序函数来获取特定的顺序。例如:

  • 如果您提供一个使用>运算符而不是<运算符进行比较的函数,则排序序列将按降序排列。
  • 您可以提供一个比较值的特定属性的函数。如果您有一个值序列struct Person { std::string name; int age; },则可以有一个仅比较年龄的函数,该函数将按年龄属性对序列进行排序。
    • 您甚至可以对多个属性进行排序。如果您age先比较,然后比较name年龄是否相等,则序列将按年龄排序 - 但在年龄相等的每个子序列中,该子序列按名称排序。

  • 您可以提供示例,而不仅仅是理论,以获得更好的解释。 (4认同)