SORT(),vector<pair<int,int> >严格基于键值,即使两个键值相同
SORT(),vector<pair<int,int> > strictly on the basis of key value even if two key value is same
从下面的代码中,我想使用 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=3
和10%7=3
。
所以我只想要输出 17 10,因为键是相同的,所以首先输入的元素应该排在第一位。
但事实并非如此,输出为 :
10 17
许多不同的方法是可能的。但是,我想只使用 sort() 来解决这个问题。我可以对我的代码进行哪些更改?
std::pair
的operator<
首先比较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
。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 'structstd::对<int,int>'没有名为'push_back'