对对向量上的stable_sort由对中的第一个元素按升序排列,没有C ++中的比较器功能

时间:2020-05-03 06:59:11

标签: c++ vector comparator std-pair stable-sort

#include <bits/stdc++.h> 
using namespace std; 

int main() 
{ 

    vector<pair<int,int>>v;
    v.push_back(make_pair(1,3));
    v.push_back(make_pair(1,1));
    v.push_back(make_pair(2,19));
    v.push_back(make_pair(2,4));

    int n = 4; 

    stable_sort(v.begin(),v.end()); 

    for (int i = 0; i < n; i++) 
        cout << "[" << v[i].first << ", " << v[i].second 
             << "] "; 

    return 0; 
} 

输出:[1, 1] [1, 3] [2, 4] [2, 19] 预期输出:[1, 3] [1, 1] [2, 19] [2, 4]

为什么对对向量即使在应用稳定排序后也无法保持相对排序,但当我们知道默认情况下对对向量是根据向量的第一个元素进行排序时? 如果我编写比较器函数,则它可以正常工作,但是当我未定义任何比较器函数时,它就无法正常工作。为什么会这样呢?

2 个答案:

答案 0 :(得分:4)

在进行比较时,使用的比较器会使用成对的两个值。

它按xtrain.tolist()(自C ++ 20起为operator<)按字典顺序比较lhs和rhs,即比较第一个元素,并且仅当它们相等时才比较第二个元素。

如果我编写比较器函数,则表明它正常工作

那是因为您可能是这样实现的:

operator<=>

默认比较器执行以下操作:

[](const auto& lhs, const auto& rhs) {
    return lhs.first < rhs.first;
}

答案 1 :(得分:2)

operator<std::pair<int, int>的{​​{3}}表示

通过运算符<在字典上比较lhs和rhs <,即比较第一个元素,并且仅当它们相等时才比较第二个元素。

因此,两个元素都用于比较std::pair,并且您看到的是完全排序的向量。元素的相对顺序仅在两个或更多元素可以视为相等时才有意义。由于该对中的两个值都用于比较,因此不能认为它们相等。因此,相对顺序在这里无关紧要。

您可以使用自定义比较器仅比较第一个元素:

stable_sort(v.begin(), v.end(), [](const auto& a, const auto& b) {return a.first < b.first; });

An将看到输出

[1, 3] [1, 1] [2, 19] [2, 4]

在这里,前两对和最后两对被认为是相等的,并保持它们的相对顺序。