📜  在C++中对2D向量进行排序|设置2(按行和列的降序排列)(1)

📅  最后修改于: 2023-12-03 14:51:15.199000             🧑  作者: Mango

在C++中对2D向量进行排序|设置2(按行和列的降序排列)

在C++中对2D向量进行排序的应用非常广泛,排序的方式也有很多种。本篇文章将介绍如何在C++中对二维向量进行按行和列的降序排列。

需求描述

我们有一个二维向量,其中每一行代表一个人,一列代表一个属性。我们需要按照每行和每列的降序排列,以便我们可以快速地找到最佳人选。

解决方案

我们可以通过使用C++中的sort()函数,以及自定义比较函数来实现对二维向量的排序。

在C++中,sort()函数的语法如下:

sort(startaddress, endaddress, comparator)
  • startaddress:要排序的第一个元素的地址。
  • endaddress:要排序的最后一个元素之后的地址。
  • comparator:比较函数,用于指定排序的方式。

现在,我们需要根据每行和每列的值来比较二维向量中的数据,并确定排序的规则。

作为一个例子,我们可以先按照每行的值进行排序。为此,我们需要编写一个表示行的比较函数,如下所示:

bool rowComparator(vector<int>& row1, vector<int>& row2) {
    return row1[0] > row2[0];
}

在这个函数中,我们首先比较第一个元素(第一列),并返回两个行的比较结果。如果第一列相等,则继续比较第二列,以此类推。

接下来,我们可以使用这个函数来对二维向量按行进行排序,如下所示:

sort(myVector.begin(), myVector.end(), rowComparator);

这将对myVector中的每一行进行排序。如果您想要按列进行排序,则可以编写一个类似的比较函数,如下所示:

bool columnComparator(vector<int>& row1, vector<int>& row2, int column) {
    return row1[column] > row2[column];
}

该函数同样需要两个行作为输入,还需要一个表示要比较的列的整数参数。它将按照指定的列进行比较,返回比较结果。

您可以使用此函数来对二维向量中的每列进行排序,如下所示:

for (int i = 0; i < myVector[0].size(); i++) {
    sort(myVector.begin(), myVector.end(), [&](vector<int>& row1, vector<int>& row2) {
        return columnComparator(row1, row2, i);
    });
}

这将循环对myVector中的每一列进行排序。其中,'&'表示按引用传递的操作符,使得我们可以在lamda表达式内部访问i变量。

完整代码
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool rowComparator(vector<int>& row1, vector<int>& row2) {
    return row1[0] > row2[0];
}

bool columnComparator(vector<int>& row1, vector<int>& row2, int column) {
    return row1[column] > row2[column];
}

int main() {
    vector<vector<int>> myVector {
        {5, 4, 3},
        {1, 2, 3},
        {8, 7, 6}
    };

    cout << "Original Vector: " << endl;
    for (auto row : myVector) {
        for (auto elem : row) {
            cout << elem << " ";
        }
        cout << endl;
    }

    sort(myVector.begin(), myVector.end(), rowComparator);

    cout << "Sorted by Row: " << endl;
    for (auto row : myVector) {
        for (auto elem : row) {
            cout << elem << " ";
        }
        cout << endl;
    }

    for (int i = 0; i < myVector[0].size(); i++) {
        sort(myVector.begin(), myVector.end(), [&](vector<int>& row1, vector<int>& row2) {
            return columnComparator(row1, row2, i);
        });
    }

    cout << "Sorted by Column: " << endl;
    for (auto row : myVector) {
        for (auto elem : row) {
            cout << elem << " ";
        }
        cout << endl;
    }

    return 0;
}
结论

现在,我们已经学会了如何在C++中对二维向量进行按行和列的降序排列。我们使用了sort()函数和自定义比较函数,让排序变得十分简单和灵活。您可以按照这个例子,自己编写更加复杂或有趣的排序算法。

参考
  1. GeeksforGeeks - Sorting 2D Vector in C++ | Set 2 (In descending order by row and column)