SORT(),vector <pair <int,int>&gt;即使两个键值相同,严格依据键值

时间:2017-11-05 10:53:48

标签: c++ sorting vector stl

从下面的代码我想在STL中使用vector<pair<int,int> >sort()进行排序。但是,问题是,我希望{strong} 基于<{>} 严格 sort(),即使两个键相等< / strong>即可。首先插入的值应该是第一个。

我的代码在这里:

vector<pair<int,int> >

输入:

让我们采取一个基本的输入:

  

2 7   17 10

这里包含键值#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; } 17%7=3

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

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

  

10 17

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

2 个答案:

答案 0 :(得分:3)

operator< std::pair首先比较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; });

答案 1 :(得分:1)

如果我得到了你想要的东西,你需要一个所谓的&#34;稳定的排序&#34;,标准库确实提供了一个恰当命名的std::stable_sort,你应该使用而不是普通的std::sort {1}}。