SORT(),vector<pair<int,int> >严格基于键值,即使两个键值相同



从下面的代码中,我想使用 STL 中的sort()vector<pair<int,int> >进行排序。但是,问题是我想严格根据sort() vector<pair<int,int> >,即使两个键相等。首先插入的值应排在第一位。

我的代码在这里:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long int n,k;
    cin>>n>>k;
    vector<pair<int,int> >a;
    for(int i=0;i<n;i++){
        int temp;
        cin>>temp;
        a.push_back(make_pair(temp%k,temp));
    }
    sort(a.begin(),a.end());
    vector<pair<int,int> >::iterator it;
    for(it=a.begin();it!=a.end();it++) {
        cout<< it->second<<" ";
    }
   return 0;
}

输入:

让我们做一个基本输入:

2 7 17 10

这里键值17%7=310%7=3

所以我只想要输出 17 10,因为键是相同的,所以首先输入的元素应该排在第一位。

但事实并非如此,输出为 :

10 17

许多不同的方法是可能的。但是,我想只使用 sort() 来解决这个问题。我可以对我的代码进行哪些更改?

std::pairoperator<首先比较first成员,如果它们相等,则比较second成员。由于要忽略second成员,因此不能使用该默认排序。您可以通过将 lambda 作为额外的参数传递给 sort 来指定要使用的比较:

std::sort(a.begin(), a.end(),
    [](const std::pair<int,int>& p1, const std::pair<int,int>& p2)
    { return p1.first < p2.first; }); // Not quite there...

但这也不会让你得到你想要的:

首先插入的值应排在第一位。

std::sort不能保证这样的事情。 您只知道最终结果服从排序,但等效元素的顺序未指定。 但是类似的功能std::stable_sort确实按照您想要的方式运行。 所以:

std::stable_sort(a.begin(), a.end(),
    [](const std::pair<int,int>& p1, const std::pair<int,int>& p2)
    { return p1.first < p2.first; });
如果我

正确得到了你想要的,你需要一个所谓的"稳定排序",标准库确实提供了一个恰当命名的std::stable_sort,你应该使用它而不是普通std::sort

最新更新