2014-02-26 121 views
1

的列比方说,我有一个2D array,我想通过它的列到sort function这需要在1D array进行排序。 可以在不将该列复制到C/C++语言中的另一array的情况下完成。我担心减少使用time and space。 (Ofcourse的复杂保持不变)传递二维数组

+0

我认为你应该可以。只需将2D数组传递给函数即可。但是可能你需要编写自己的排序函数,而不是使用通用的'sort'或'qsort'。 – rcs

+0

@ rcs实际问题很简单。在我来说,我只是想探索是否能在我给了,而不仅仅是解决问题的设置来完成。 – kamalbanga

+0

那么,如果解释你第一索引作为列索引(一个[M] [N] - 第n从第m行列),则可以只通过一个[M]。如果谈论C++,你可以使用向量的载体,不担心有通过一列的长度。 – zoska

回答

4

我想通过sort你的意思是std::sort来自STL,它采用随机访问迭代器。所以你需要做的就是提供列迭代器。

你可以自己实现一个(example),使用一些迭代器库(即Boost.Iterator)或使用一些提供行/列迭代器的矩阵实现。

0

据我所知,多维数组存储在C/C++实际上是一个1D-arrary,

,你可以参考在这篇文章很好的解释: How to get column of a multidimensional array in C/C++?

因此,我不认为有任何默认/简单的方法来提取二维数组的特定列并将其传递给另一个函数。

+0

好了,我发现,在你提到的帖子解释不能完成。 – kamalbanga

+1

Johny写道 - 提供适当的迭代器就足够了。C++世界中的迭代器是最常见的结构,所以我不会说没有'简单'的方式 – zoska

+0

我同意你和我upvote @Johny的答案以及:) 我在想的是,它是相当我很难直接将一列传递给his_own_sort(),而无需使用外部库或预处理... – shole

2

如果你可以编写你自己的排序函数,这很容易;你只是使界面这样的:

void Sort (T a [], size_t n, size_t stride); 

的关键是在stride参数,这是这种“虚拟的”数组的元素之间的距离。举例来说,如果你有一个float x [10][20];,你想送其列#2,你可以这样做:(为了清楚省略了一些石膏)

Sort (x[0] + 2, 10, 20); // Usually, stride is the width of the 2D array 

里面的Sort功能,您可以访问的i个元素有这样一个步幅的阵列:

a[i * stride] = 42; 

就是这样。

您可以使用相同的原则编写自己的MatrixColumnView类包装了这一概念,并可以被传递到了采取阵列模板功能。

如果您想使用STL或STL类库,您可以简单编写自己的MatrixColumnIterator迭代器类,该类本质上在内部使用跨度并对二维数组的列进行迭代。