基于彼此相对的对值,对由嵌套对组成的向量进行排序?

时间:2019-06-28 14:03:19

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

所以我有一个向量说:

vector<pair<pair<int,int>,pair<int,int>>>

具有以下元素:

[(11,13),(2,1)], [(5,6),(1,2)] ,[(9,10),(1,3)] ,[(5,8),(3,4)] , 
[(12,14),(2,7)].

排序后(即主要相对于第二对的第一个值,其次相对于第一对的第二个值... 因此,排序后的输出应如下所示:

[(5,6),(1,2)] ,[(9,10),(1,3)] ,[(11,13),(2,1)] ,[(12,14),(2,7)] ,
[(5,6),(3,4)]

我已经读到,如果向量包含一对,我们可以使用第一个或第二个值进行排序,但是如果向量包含嵌套对,那么如何进行处理。...

编辑: 试图实现它,如下所示:https://www.geeksforgeeks.org/sorting-vector-of-pairs-in-c-set-1-sort-by-first-and-second/

代码如下:

bool sortbysecfirst(const pair<pair<int,int>,pair<int,int>> &a,const pair<pair<int,int>,pair<int,int>> &b) { 
    return (a.second.first < b.second.first); 
}

bool sortbyfirstsec(const pair<pair<int,int>,pair<int,int>> &a,const pair<pair<int,int>,pair<int,int>> &b) { 
    return (a.first.second < b.first.second); 
}

sort(arr.begin(),arr.end(),sortbysecfirst);
sort(arr.begin(),arr.end(),sortbyfirstsec);

现在可用于以下对:

[(11,13)(2,1)],[(5,6)(1,2)],[(9,10)(1,3)],[(5,8)(3,4)],[(6,7)(1,5)],
 [(10,15)(5,6)],[(12,14)(2,7)],[(1,2),(1,8)],

答案应该是:

[1, 2, 1, 8], [5, 6, 1, 2], [6, 7, 1, 5],  [9, 10, 1, 3], [11, 13, 2, 1], [12, 14, 2, 7],[5, 8, 3, 4], [10, 15, 5, 6], 

但是我得到这个答案:

[1, 2, 1, 8], [5, 6, 1, 2], [6, 7, 1, 5], [5, 8, 3, 4], [9, 10, 1, 3], [11, 13, 2, 1], [12, 14, 2, 7], [10, 15, 5, 6],

1 个答案:

答案 0 :(得分:2)

您可以使用标头element.find($(":radio[name=public][value='F']")).prop("checked", true) Query.fn.init [input.abs7, selector: "#scheduleRegistrationLayer form[name="scheduleform"] [object Object]", prevObject: jQuery.fn.init(1), context: document] 中声明的标准函数std::tie

您在这里。

<tuple>

程序输出为

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

int main()
{
    std::vector<std::pair<std::pair<int,int>, std::pair<int,int>>> v =
    {
        { { 11, 13 }, { 2, 1 } }, { { 5, 6 }, { 1, 2 } }, { { 9, 10 }, { 1, 3 } } ,
        { { 5, 8 }, { 3, 4 } }, { { 12, 14 }, { 2, 7 } }
    };

    for ( const auto &p : v )
    {
        std::cout << "{ ";          
        std::cout << "{ " << p.first.first << ", " << p.first.second << " }, ";
        std::cout << "{ " << p.second.first << ", " << p.second.second << " } ";
        std::cout << "}, "; 
    }

    std::cout << '\n';

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

    for ( const auto &p : v )
    {
        std::cout << "{ ";          
        std::cout << "{ " << p.first.first << ", " << p.first.second << " }, ";
        std::cout << "{ " << p.second.first << ", " << p.second.second << " } ";
        std::cout << "}, "; 
    }

    std::cout << '\n';
}

关于您显示的此代码段

{ { 11, 13 }, { 2, 1 } }, { { 5, 6 }, { 1, 2 } }, { { 9, 10 }, { 1, 3 } }, { { 5, 8 }, { 3, 4 } }, { { 12, 14 }, { 2, 7 } }, 
{ { 5, 6 }, { 1, 2 } }, { { 9, 10 }, { 1, 3 } }, { { 11, 13 }, { 2, 1 } }, { { 12, 14 }, { 2, 7 } }, { { 5, 8 }, { 3, 4 } }, 

然后,每次bool sortbysecfirst(const pair<pair<int,int>,pair<int,int>> &a,const pair<pair<int,int>,pair<int,int>> &b) { return (a.second.first < b.second.first); } bool sortbyfirstsec(const pair<pair<int,int>,pair<int,int>> &a,const pair<pair<int,int>,pair<int,int>> &b) { return (a.first.second < b.first.second); } sort(arr.begin(),arr.end(),sortbysecfirst); sort(arr.begin(),arr.end(),sortbyfirstsec); 的调用都会对向量进行重新排序,从而破坏了先前调用设置的顺序。