c++ - 如何按两个值而不是仅第二个值对成对 vector 进行排序?

标签 c++ algorithm sorting vector std-pair

我想要做的是以第一个值从最低到最大、第二个从最大到最低的方式对 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/

相关文章:

c++ - C++中的指针容器

c++ - 为什么为 noexcept 和 throw() 生成的目标代码在 C++11 中是相同的?

c# - 按其包含的项目对项目进行分组

algorithm - 需要找到数组第一行和其余行之间的最小差异

算法 - 将文件夹分成组

sorting - 如何使用 Gremlin 对 Noe4j 结果进行排序和限制?

c++ - 将 Armadillo 中的矩阵从稀疏矩阵转换为密集矩阵(spmat 到 mat)

使用 qsort 对 C 数组进行排序?

javascript - 如何按值(value)对产品进行排序?

c++ - 函数总和第一个值 3 次而不是其他 2 个值