【问题标题】:How does comparator function of c++ STL sort work?c++ STL排序的比较器功能如何工作?
【发布时间】:2020-11-20 23:11:15
【问题描述】:
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

【问题讨论】:

  • 默认情况下,C++ 会尝试 std::less 是否适用,如果适用,则不必使用比较函数。此外,如果您使用实现了 bool operator &lt;() 的对象,则 stl::sort 也可以使用更少。请注意,运算符 bool 应该具有绝对顺序。

标签: c++ sorting stl


【解决方案1】:

有序序列s的概念,抽象地说是对于任何一对元素s[i]s[j],当i小于@987654328时s[i]不大于s[j] @。

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

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

通过将此比较函数与排序算法一起应用, std::sort 能够确定元素应处于的顺序以进行排序。这就是 sort 函数所做的一切:它将这个比较函数应用于元素对并重新排列它们,直到序列被排序。

您可以提供具有strict weak orderingstd::sort 的任何比较函数fn 将根据需要重新排列元素,以确保!fn(s[i], s[j]) 对于所有有效索引对ij 都为真,其中@987654340 @。这允许您操纵排序功能来获得特定的订单。例如:

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

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2020-10-22
    • 2018-09-07
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多