【发布时间】:2021-12-10 23:31:49
【问题描述】:
我知道如何使用std:sort(v.begin(), v.end()); 对向量对进行排序,但这将对向量的所有对进行排序。
但我想在指定范围内对向量进行排序。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool sortbysecdesc(const pair<int,int> &a,const pair<int,int> &b)
{
return a.second>b.second;
}
int main(){
int n;
cin>>n;
ll a[n];
ll b[n];
vector<pair<ll, ll>> v;
vector<pair<ll, ll>>::iterator itr;
for (int i = 0; i < n; i++) {
cin>>a[i];
}
for (int i = 0; i < n; i++) {
cin>>b[i];
}
for (int i = 0; i < n; i++) {
v.push_back(make_pair(a[i],b[i]));
}
//sorting the pair in descending order with second element
sort(v.begin(), v.end(), sortbysecdesc);
for (itr=v.begin(); itr!=v.end(); itr++) {
/* Logic to be implement */
}
return 0;
}
代码解释-在这里,我将输入 2 个数组并通过将 first_array[i] 元素与 second_element[i] 元素组合来制作一对向量。
比如-first_array = {1, 5, 4, 9}和second_array = {2, 10, 5, 7},那么pair的向量将是size = 2*size_of(first/second array),元素将是[{1, 2}, {5, 10}, {4, 5}, {9, 7}]。
然后我根据对的第二个元素(即第二个数组的所有元素)按降序对这些对进行排序。
现在我想对第二个元素相等的向量形式进行排序。
例如 - 如果向量是[{1,6} , {4,5}, {3,5}, {8,5}, {1,1}]。这里 5 在 pair 的第二个元素中出现了三次,因此按升序对它们的第一个索引进行排序。
预期结果 - [{1,6} , {3,5}, {4,5}, {8,5}, {1,1}]
注意 - 我们已经按降序对第二个元素进行了排序。
【问题讨论】:
-
您的代码有一些不良习惯,这些习惯通常出现在所谓的“竞赛”或“在线评判”网站上。请不要使用这些网站来学习任何东西,这不是它们的用途(除非您想知道代码有多糟糕且经常无效,就像您的程序一样(坏习惯和无效的 C++) )。
-
您是否考虑过简单地将
if(a.second == b.second) { return a.first < a.second; }部分添加到您的比较器sortbysecdesc()? -
@Frank 嘿,工作正常 :) 但如果想比较最终向量的第二个元素是否多次出现:(
-
顺便说一句,如果您可以反转对中元素的顺序(即,pair 而不是 ),向量将按照您的方式自动排序想要它:stackoverflow.com/a/2819287/10908201
-
向量对!=向量对
标签: c++ algorithm sorting stl std-pair