如何按第一个和第二个索引对 C++ 中的二维向量进行排序?

How can I sort a 2D vector in C++ by the first and second index?

我想知道如何在 C++ 中对 2D 向量进行排序,以便它按两个元素排序。按照第一个元素升序排列,如果第一个元素有多个,则按照第二个元素升序排列。这是我的意思的一个例子:

vector<vector<int>> vec = {{10, 23}, {10, 22}, {1, 100}, {13, 12}};

这将被分类为:

{{1, 100}, {10, 22}, {10, 23}, {13, 12}}

像这样:

int m = vec.size();
int n = vec[0].size();
sort(vec[0].begin(), vec[0].end());


for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++)
        cout << vec[i][j] << " ";
    cout << endl;
}

我看到的时候觉得这很酷。使用与 std::sort 的比较函数,您可以编写如下内容。这很好地扩展并且在嵌套排序上非常灵活!

bool comp(vector<int> v1, vector<int> v2)
{
    if(v1[0]<v2[0])
        return true;
    else if(v1[0]==v2[0])
        return v1[1]<v2[1];
    else
        return false;
} 
sort(vec.begin(), vec.end(), [&](vector<int> &a, vector<int> &b){
        return  a[0] < b[0]? true : (a[0] == b[0]) ?  a[1] < b[1] : false;
    });

如果您使用的是 C++20 std::ranges::sort 将是一个不错的选择:

#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<std::vector<int>> vec = {{10, 25}, {10, 23}, {10, 22},
                                         {10, 24}, {1, 100}, {13, 12}};
    std::ranges::sort(vec);

    for (const auto& row : vec) 
        for (const auto& col : row) 
            std::cout << col << " ";            
}

Live sample

输出:

1 100 10 22 10 23 10 24 10 25 13 12 

如果不是 std::sort 也同样有效:

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<std::vector<int>> vec = {{10, 25}, {10, 22}, {10, 26},
                                         {10, 24}, {1, 100}, {13, 12}};
    std::sort(vec.begin(), vec.end());

    for (const auto& row : vec)
        for (const auto& col : row) 
            std::cout << col << " ";
}

Live sample

输出:

1 100 10 22 10 24 10 25 10 26 13 12