在二维数组上进行c ++排序编译失败

时间:2015-12-07 00:20:06

标签: c++ sorting stl

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

int a[5000][2];

我用这个命令调用sort函数:

sort(a, a + n, cmp);

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

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

我已经加入了<algorithm>。但是,在使用g ++编译文件时,它失败了一大块错误信息,都指向lib文件而不是我的程序。我确定问题在于我的调用sort函数,因为一旦我删除了sort函数,编译就成功了。

任何人都知道我的计划有什么问题?

以下是一些错误信息:

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行是调用排序函数的行

2 个答案:

答案 0 :(得分:1)

<强> EDITED

您可以将整数对表示为您自己的整数对结构的数组,而不是使用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;
}

答案 1 :(得分:1)

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

  

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

所以你不能传递指针,因为它们超出了范围:D 我不知道如何使用sort fucntion两个dimmensional数组。但是您可以轻松地将它用于自定义类。像这样的东西(它不是工作代码):

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

UPDATE1: 经过一些研究和阅读更新的帖子与错误我认为它不是指针完全。而是将2d数组传递给sort函数可能会有问题。 Fortunetly你可以使用std :: sort作为向量的向量,如下所示: How to sort a 2D array using the sort function in c++? 还指出比较函数的参数必须是静态的。我认为你首先会以这种方式修改你的代码。

我还发现使用这个很酷的技巧可以使用std :: sort for 2d数组: https://www.quora.com/How-do-I-sort-a-2D-array-based-on-1-parameter-in-C++-using-an-STL-function 你也应该尝试一下。它是关于使用静态强制转换来传递函数而不是2d数组,而是对数组。

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

  

然后你不能对“指针”进行排序,因为那个数据结构根本就没有指针......一个接一个地只有5000 * 2 = 10 000个ints

所以你的问题结合了1)使用2d array-&gt;的原因。它不像你正在排序每一秒int,而是你的排序将适用于所有10 000英镑而不用担心它们是2d ... 2)因此,排序不会向您的比较功能发送地址。相反,它会发送您正在使用的值并将其用作指针。