【问题标题】:How can I sort a pair of vector in some given range?如何在给定范围内对一对向量进行排序?
【发布时间】: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 &lt; a.second; } 部分添加到您的比较器sortbysecdesc()
  • @Frank 嘿,工作正常 :) 但如果想比较最终向量的第二个元素是否多次出现:(
  • 顺便说一句,如果您可以反转对中元素的顺序(即,pair 而不是 ),向量将按照您的方式自动排序想要它:stackoverflow.com/a/2819287/10908201
  • 向量对!=向量对

标签: c++ algorithm sorting stl std-pair


【解决方案1】:

您必须更新排序功能。试试这个。

bool sortbysecdesc(const pair<int,int> &a,const pair<int,int> &b)
{
       return a.second == b.second ? a.first < b.first : a.second > b.second;
}

Demo

【讨论】:

  • 兄弟,但我的 sortbysecdesc 函数工作正常。我想检查对的最终向量,如果向量的第二个元素出现多个,那么我想按升序对向量的第一个元素进行排序
  • @Uttam:你尝试过建议的答案吗?
  • @SumitJha: 函数名应该改变(或者使用 lambda 来完全避免命名 ;-))。
  • @Jarod42 是的,但它没有用,或者我做错了什么,您能否按照我的要求发布整个代码。
  • @Jarod42 感谢您添加演示。
【解决方案2】:

你需要的是类似下面的东西

#include <tuple>
#include <vector>
#include <iterator>
#include <algorithm>

//...

std::sort( std::begin( v ), std::end( v ),
           []( const auto &p1, const auto &p2 )
           {
               return std::tie( p2.second, p1.first ) < std::tie( p1.second, p2.first );
           } ); 

这是一个演示程序。

#include <iostream>
#include <tuple>
#include <vector>
#include <iterator>
#include <algorithm>

int main() 
{
    std::vector<std::pair<long long, long long>> v =
    {
        {1,6} , {4,5}, {3,5}, {8,5}, {1,1}
    };
    
    std::sort( std::begin( v ), std::end( v ),
               []( const auto &p1, const auto &p2 )
               {
                    return std::tie( p2.second, p1.first ) <
                           std::tie( p1.second, p2.first );
               } );
               
    for ( const auto &p : v )
    {
        std::cout << "{ " << p.first << ", " << p.second << " } ";
    }
    
    std::cout << '\n';
    
               
    return 0;
}

程序输出是

{ 1, 6 } { 3, 5 } { 4, 5 } { 8, 5 } { 1, 1 }  

【讨论】:

  • 由于 OP 混合了降序和升序,我们也必须混合参数:return std::tie(p2.second, p1.first) &lt; std::tie(p1.second, p2.first);.
  • 我也试过你的方法。但是:(你能不能请到这个练习题codechef.com/UAPRAC/problems/PSORT3
  • @Jarod42 谢谢。我已经更新了代码。
  • @VladfromMoscow 嘿,非常感谢您的帮助 :) 但是您为什么到处使用 const 以及 std:tie() 的作用。你能解释一下吗
  • 然后我会将其标记为已接受的答案 :) 但现在我正在投票
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多