基于列对二维向量数组进行排序

Posted

技术标签:

【中文标题】基于列对二维向量数组进行排序【英文标题】:Sorting 2D Vector Array Based On a Column 【发布时间】:2016-04-07 09:00:44 【问题描述】:

我有一个 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】:

尝试使用std::sortlike

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,

【讨论】:

以上是关于基于列对二维向量数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

C++ 按列对二维向量进行排序

如何按列对二维数组(锯齿状)进行排序[重复]

在C#中按列对二维数组进行排序

C++ 使用冒泡排序根据第一列对二维数组的行进行排序

使用 std::sort 对具有特定标准的二维向量进行排序

如何在 C# 中对二维(矩形)数组进行排序?