c++排序二维数组编译失败

Posted

技术标签:

【中文标题】c++排序二维数组编译失败【英文标题】:c++ sort on a 2-dimensional array compile failed 【发布时间】:2015-12-07 00:20:06 【问题描述】:

我正在编写一个 c++ 程序来根据第一个元素对 int 对进行排序。

int a[5000][2];

我用这个命令调用排序函数:

sort(a, a + n, cmp);

其中n是我要排序的元素个数,cmp的定义如下:

bool cmp(int *a, int *b) 
    return a[0] < b[0];

我已经包含了&lt;algorithm&gt;。但是,在使用 g++ 编译文件时,它失败并显示大量错误信息,全部指向 lib 文件而不是我的程序。我确定问题出在我调用的排序函数上,因为一旦我删除排序函数,编译就成功了。

有人知道我的程序有什么问题吗?

以下是一些错误信息:

In file included from /usr/include/c++/4.8/bits/stl_pair.h:59:0,
             from /usr/include/c++/4.8/bits/stl_algobase.h:64,
             from /usr/include/c++/4.8/bits/char_traits.h:39,
             from /usr/include/c++/4.8/ios:40,
             from /usr/include/c++/4.8/ostream:38,
             from /usr/include/c++/4.8/iostream:39,
             from milk2.cpp:7:
/usr/include/c++/4.8/bits/stl_algo.h: In instantiation of ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = bool (*)(int*, int*)]’:
/usr/include/c++/4.8/bits/stl_algo.h:2226:70:   required from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = bool (*)(int*, int*)]’
/usr/include/c++/4.8/bits/stl_algo.h:5500:55:   required from ‘void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = int (*)[2]; _Compare = bool (*)(int*, int*)]’
milk2.cpp:32:29:   required from here
/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);

我的程序是 milk2.cpp。第7行是:

#include <iostream>

第32行是调用排序函数的行

【问题讨论】:

“我确定问题出在排序功能上” - 不。它在你的代码中。 您能否至少显示一些“大量错误信息”? milk2.cpp:32:29: required from here 看第 32 行。 【参考方案1】:

首先向我们展示错误。 第二件事是,在 std::sort 的文档中,我们可以阅读有关比较功能的信息:

二进制函数,接受范围内的两个元素作为参数,并返回一个可转换为 bool 的值。返回的值指示作为第一个参数传递的元素是否被认为在其定义的特定严格弱排序中位于第二个之前。 该函数不得修改其任何参数。 这可以是函数指针或函数对象。

所以你不能将指针传递给它,因为它们超出了范围:D 我不确定如何对两个维度数组使用排序功能。但您可以轻松地将它用于您的自定义类。像这样的东西(它不工作的代码):

class foo 
public:
int x, y;


bool compare (foo one, foo two)

  return one.x > two.x;

int main () 
  foo data [N];
  sort(data, a + N, compare);

更新1: 经过一些研究并阅读了带有错误的更新帖子后,我认为这与指针完全无关。将二维数组传递给 sort 函数可能会有问题。幸运的是,您应该像这里所做的那样使用 std::sort 作为向量的向量: How to sort a 2D array using the sort function in c++? 还指出比较函数的参数必须是静态的。我认为您首先应该以这种方式修改您的代码。

我还发现可以通过这个很酷的技巧将 std::sort 用于二维数组: https://www.quora.com/How-do-I-sort-a-2D-array-based-on-1-parameter-in-C++-using-an-STL-function 你也应该试试。这是关于使用静态转换传递给排序函数而不是二维数组,而是 Pairs 数组。

以下是数组数组不能与排序一起使用的解释: Sort a 2D character Array using sort() in C++ 正如那里所写,重点是:

那么您无法对“指针”进行排序,因为该数据结构根本没有指针......只有 5000*2= 10 000 个整数一个接一个

所以您的问题结合了 1) 使用 2d 数组的原因-> 它不像您每隔一个 int 进行排序,而是您的排序将适用于所有 10 000 个 int,而无需注意它们是 2d ... 2)所以就像排序没有向您的比较功能发送地址一样。相反,它应该发送您作为指针使用和使用的值。

【讨论】:

抱歉,我不明白“范围”指的是什么。你能告诉我它是什么吗?【参考方案2】:

已编辑

您可以将整数对表示为您自己的整数对结构的数组,而不是使用 2d int 数组(本质上被视为 5000x2 1d 数组)

struct IntegerPair 
    IntegerPair(int a, int b) : a(a), b(b)   
    int a;
    int b;
;

使用 std::vector 创建整数列表

#include <vector>
...
std::vector<IntegerPair> myIntegerPairs;

// enter your data
... myIntegerPairs.push_back(IntegerPair(ai,bi));

并将 std::sort 与旨在比较 IntegerPair 对象中的第一个整数的比较函数一起使用

std::sort(myIntegerPairs.begin(), myIntegerPairs.end(), compareByFirstInteger);
...
bool compareByFirstInteger(const IntegerPair &a, const IntegerPair &b)

    return a.a < b.a;

【讨论】:

你可以只传递 a 和 b 的值——它并不比传递指针更多的复制,而且你保存了 2 个指针取消引用。应该会快一些。 因为我要排序的其实是一个(array of (array of 2)),a和b都是int[2]。传递指针似乎是编写比较函数的唯一方法,除非我使用对或定义结构。你知道为什么传递指针不起作用吗? 参见 Dominiks 最后一段下面,他链接到现有的 SE 线程(“在 C++ 中使用 sort() 对 2D 字符数组进行排序)。我认为线程很好地回答了你的问题。如果你想使用std::sort,您将不得不使用我的答案中描述的结构解决方案、Dominik 在下面他的答案的更新 1 部分中链接到的“hackier”对解决方案,或者在现有 SE“Sort 2D 中描述的向量方法”。 ..”线程。或者,为 int[][] 2D 向量编写您自己的自定义排序函数。

以上是关于c++排序二维数组编译失败的主要内容,如果未能解决你的问题,请参考以下文章

Vector容器 二维数组sort()排序

二维数组中的查找(C++和Python实现)

c++中的new()申请二维数组

c++二维数组和二级指针

c++ 用户输入 2个值 定义二维数组 但是报错

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