gpt4 book ai didi

c++ - 如何按第一列在二维矩阵上使用 std::sort?

转载 作者:行者123 更新时间:2023-11-28 06:16:35 25 4
gpt4 key购买 nike

如何将 std::sort 应用于以下数据结构?

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]); };

虽然两个 lambda 都适用于 std::range_equal,但编译器 (gcc 4.8) 不接受将此 lambda 用于 std::sort,报告如下:

/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 和 std::equal_range)

最佳答案

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

Type requirements
- The type of dereferenced RandomIt must meet the requirements of MoveAssignable and MoveConstructible.

为了排序,您只需要一个容器,其元素 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}

关于c++ - 如何按第一列在二维矩阵上使用 std::sort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30164746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com