Вектор сортировки, состоящий из вложенных пар, основанных на разных значениях пар относительно друг друга? - PullRequest
0 голосов
/ 28 июня 2019

Итак, у меня есть вектор:

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)]

Я читал, что мы можем отсортировать, используя первое или второе значение, если вектор содержит пару, но как поступить, если вектор содержит вложенные пары ....

Edit: Пытался реализовать это, как показано здесь: 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 Ответ

2 голосов
/ 28 июня 2019

Вы можете использовать стандартную функцию 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);

затем каждый вызов std::sort заново сортирует вектор, уничтожая порядок, установленный предыдущим вызовом.

...