我想要做的是以第一个值从最低到最大、第二个从最大到最低的方式对 vector 对进行排序,并优先于第一个值排序,同时将它们保持在一起。例如,假设我有以下代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
pair<int, double> p;
vector<pair<int, double> > vp;
p.first = 2;
p.second = 2.4;
vp.push_back(p);
p.first = 9;
p.second = 3.0;
vp.push_back(p);
p.first = 10;
p.second = 3.1;
vp.push_back(p);
p.first = 1;
p.second = 2.4;
vp.push_back(p);
p.first = 5;
p.second = 3.1;
vp.push_back(p);
}
如果我要通过循环打印它,我希望它从输出开始:
2, 2.4
9, 3.0
10, 3.1
1, 2.4
5, 3.1
输出这个
5, 3.1
10, 3.1
9, 3.0
1, 2.4
2, 2.4
现在想象一下,如果这些值不是手动给出的,而是随机的,并且通过 for 循环进行随机化,每次运行代码时,该循环都会循环 0 到 100(含)之间的随机次数,每个新的随机值该对的两边都存储在 vector 中(这将使 vector 的大小为 10。)
如何对 vector 进行排序,使其输出的顺序与上面的示例相同?
最佳答案
最简单的方法是使用标准函数 std::sort()
和 std::tie()
。
这是一个演示程序:
#include <iostream>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<std::pair<int, double>> v =
{
{ 2, 2.4 },
{ 9, 3.0 },
{ 10, 3.1 },
{ 1, 2.4 },
{ 5, 3.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 << '\n';
}
}
程序输出为:
5 3.1
10 3.1
9 3
1 2.4
2 2.4
关于c++ - 如何按两个值而不是仅第二个值对成对 vector 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70658717/