gpt4 book ai didi

c++ - 根据相对于彼此的不同对值对由嵌套对组成的 vector 进行排序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:43 26 4
gpt4 key购买 nike

所以我有一个 vector 说:

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

我读到如果一个 vector 包含一个对,我们可以使用第一个或第二个值进行排序,但是如果一个 vector 包含嵌套对,我们该如何继续......

编辑:试图实现它,如下所示: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],

最佳答案

您可以使用标准函数 std::tie在 header 中声明 <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重新对 vector 进行排序,破坏之前调用设置的顺序。

关于c++ - 根据相对于彼此的不同对值对由嵌套对组成的 vector 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56808409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com