stl中的比较器

时间:2018-06-15 10:51:02

标签: c++ stl

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);

compareInterval将返回true或false,但sort函数如何将0和1作为参数并根据compareIntervals排序,因为sort函数看起来像sort(arr,arr + n,0)或sort (arr,arr + n,1)

2 个答案:

答案 0 :(得分:4)

当您编写sort(arr, arr+n, compareInterval)时,不会立即调用compareInterval函数。那将是sort(arr, arr+n, compareInterval())(这不会起作用)。

因此std::sort没有为其第三个参数获得bool值。它获得了一个指向函数compareInterval的指针。然后,它可以使用此指针到函数值,根据需要多次调用compareInterval,使用各种Interval个对象来确定正在排序的元素的正确顺序。

答案 1 :(得分:1)

只要内部排序逻辑需要,就会调用sort作为第3个参数提供的函数(根据实现的排序算法)。 sort函数选择调用函数的参数。 您可以在此处详细了解:http://en.cppreference.com/w/cpp/algorithm/sort

您可以直接在std :: sort中编写lambda而不是compare函数。

Interval arr[] =  { {6,8}, {1,9}, {2,4}, {4,7} };
int n = sizeof(arr)/sizeof(arr[0]);

std::sort(arr, arr+n, [](Interval& i1, Interval& i2) {return i1.start < i2.start;});