在 Cpp 中对 Vector of Vector 进行排序

Sorting a Vector of Vector in Cpp

假设我有这个vector[[5,10],[2,5],[4,7],[3,9]]的vector,我想用cpp的sort()方法对它进行排序,排序后变成这个[[5,10],[3,9],[4,7],[2,5]]。那就是我想根据第二个索引进行排序。

现在我已经写了这段代码来对这个vector of vector进行排序,但是它不能正常工作。

static bool compareInterval( vector<vector<int>> &v1, vector<vector<int>> &v2)
    {
        return (v1[0][1]>v2[0][1]);
    }
    

sort(boxTypes.begin(), boxTypes.end(), compareInterval);

谁能告诉我哪里错了,我能改正吗?提前致谢。

你的类型可能看起来像

std::sort(boxTypes.begin(), boxTypes.end(), [](auto const& lhs, auto const& rhs) {
    return lhs[1] > rhs[1];
});

换句话说,按每个向量的 [1] 元素排序,并使用 > 降序排序。请注意,在 lambda 函数中 lhsrhs 的类型为 const std::vector<int>&.

距离投影对此会有一定的帮助。

ranges::sort 算法将收到:

  • 只是要排序的向量;开始和结束没有迭代器。
  • (可选)要用于排序的函数,在本例中为 greater
  • (可选)投影:对于原始向量的每个元素 t,它恰好是两个元素的另一个向量,获取它的第二个元素,即 t[1],然后对其进行排序.
std::ranges::sort(boxTypes, std::ranges::greater{}, [](auto&& bt) { return bt[1]; });

请注意,我只能在 msvc 上进行编译,不能在 gcc 或 clang 上进行编译(使用 /std:c++latest,甚至不能使用 /std:c++20;https://godbolt.org/z/9Kqfa9vhx ).

当您的代码对向量的向量进行排序时,它会将两个向量(不是向量的向量)传递给布尔函数,然后比较它们以确定它们是否需要互换,或者它们相对于每个向量的位置是否正确其他.

因此,这里您只需要比较 2 个向量(您已经尝试比较向量中的向量)。

您需要在 compareInterval 中进行的更改是:

static bool compareInterval( vector<int> &v1, vector<int> &v2)
{
    return (v1[1]>v2[1]);
}

在下面找到我的测试代码:

#include <bits/stdc++.h>

using namespace std;

static bool compareInterval( vector<int> &v1, vector<int> &v2)
{
    return (v1[1]>v2[1]);
}

int main() {
    vector<vector<int>> boxTypes = {{5,10},{2,5},{4,7},{3,9}};
        
    sort(boxTypes.begin(), boxTypes.end(), compareInterval);
    
    for(int i=0;i<4;i++)
        cout<<boxTypes[i][0]<<" "<<boxTypes[i][1]<<"\n";
}