如何使用std ::按第一列对2D矩阵进行排序

How to use std::sort on a 2d matrix by first columns?

本文关键字:2D 排序 一列 std 何使用      更新时间:2023-10-16

如何应用std ::排序以下数据结构?

static unsigned Data[][3] = {
  {A1, b1, c1},
  {A2, B2, C2},
  ...};

应进行订购,以比较第一列:

{A,B,C} < {X,Y,Z} <==> A<X.

此代码是自动生成的,以包含在另一个C 代码库中,并且在一代中,我无法访问" A"的数值,因此我需要在运行时订购它。

我尝试了以下内容:

std::sort(std::begin(Data), std::end(Data), Comp);

与Comp定义为:

const auto Comp = [](const unsigned (&a)[3], const unsigned (&b)[3]) { return (a[0] < b[0]); };

或:

const auto Comp = [](const unsigned a[3], const unsigned b[3]) { return (a[0] < b[0]); };

尽管两个lambdas都适用于std :: range_equal,但编译器(GCC 4.8)不接受此lambda用于std :: stort,请按以下方式报告:

/usr/include/c++/4.8/bits/stl_algo.h:5491:55:   
required from ‘void std::sort(_RAIter, _RAIter, _Compare) 
[with _RAIter = unsigned int (*)[3]; _Compare =    
f(const llvm::MCInst&, const OperandVector&, llvm::SMLoc&)::__lambda1]’
....
/usr/include/c++/4.8/bits/stl_algo.h:2162:11: 
error: array must be initialized with a brace-enclosed initializer
__val = _GLIBCXX_MOVE(*__i);

事先感谢您的帮助。

ps:我不想使用

std::vector<std::tuple<unsigned,unsigned,unsigned>> 

而不是

unsigned[][3]

都不

std::map<unsigned,std::vector<std::pair<unsigned,unsigned>>> 

作为数据结构(后者将避免std :: sort and std :: quare_range)

原始数组不可移动,这是std::sort的要求:

类型要求
- 注入的RandomIt的类型必须满足MoveAssignableMoveConstructible的要求。

为了排序,您只需要一个元素的容器 MoveAssignable即可。像std::array

using Inner = std::array<unsigned, 3>;
std::array<Inner, 4> arr = {
    {5, 1, 2},
    {6, 2, 3},
    {2, 5, 10},
    {5, 0, 0}
};
std::sort(std::begin(arr), std::end(arr), [](const Inner& a, const Inner& b){
    return a[0] < b[0];
});
// now, arr is {2,5,10}, {5,1,2}, {5,0,0}, {6,2,3}