基于列对2D矢量阵列进行排序

时间:2016-04-07 09:00:44

标签: c++ arrays sorting vector

我有一个 2d矢量数组,其中包含:

row id   r   b   main  
   1     0   26   3
   2     1   11   2
   3     1   46   4
   4     2   26   1
   5     3   11   2

我想根据其"main"-column值对每一行进行排序 较小的"main"-column。 较小的值=>整行应位于顶部。

如果有两行或更多行且"main"-column具有相同的值,我想检查"r"-column。  较小的值=>整行应位于顶部。

排序后

将如下所示:

row id   r   b   main  
   4     2   26   1
   2     1   11   2
   5     3   11   2
   1     0   26   3
   3     1   46   4

1 个答案:

答案 0 :(得分:3)

尝试使用std::sort之类的

using int_arr = std::array<int, 4>;
std::sort(std::begin(arr), std::end(arr), [](const int_arr& a, const int_arr& b){
    return a[3] != b[3] ? a[3] < b[3] : a[1] < b[1];
});

<强>演示

#include <iostream>
#include <array>
#include <algorithm>

int main() {
    using int_arr = std::array<int, 4>;
    int_arr arr[5] = { 
        {1, 0, 26, 3}, 
        {2, 1, 11, 2}, 
        {3, 1, 46, 4}, 
        {4, 2, 26, 1}, 
        {5, 3, 11, 2}
    };

    for(const auto& i_arr : arr) {
        for(const auto& i : i_arr)
            std::cout<< i <<", ";
        std::cout << "\n";
    }

    std::cout << "**************\n";

    std::sort(std::begin(arr), std::end(arr), [](const int_arr& a, const int_arr& b){
        return a[3] != b[3] ? a[3] < b[3] : a[1] < b[1];
    });

    for(const auto& i_arr : arr) {
        for(const auto& i : i_arr)
            std::cout<< i <<", ";
        std::cout << "\n";
    }
}

输出

1, 0, 26, 3, 
2, 1, 11, 2, 
3, 1, 46, 4, 
4, 2, 26, 1, 
5, 3, 11, 2, 
**************
4, 2, 26, 1, 
2, 1, 11, 2, 
5, 3, 11, 2, 
1, 0, 26, 3, 
3, 1, 46, 4,