【问题标题】:Pass a column of 2D array传递一列二维数组
【发布时间】:2014-02-26 09:07:13
【问题描述】:

假设我有一个2D array,我想将它的第 i 列传递给一个sort function,它接受一个1D array 并对其进行排序。 是否可以在不将列复制到 C/C++ 语言中的另一个 array 的情况下完成。我担心减少使用的time and space。 (当然复杂性保持不变)

【问题讨论】:

  • 我想你应该可以。只需将二维数组传递给函数。但您可能需要编写自己的排序函数,而不是使用通用的sortqsort
  • @rcs 实际的问题很容易解决。就我而言,我只是想发现它是否可以在我给定的设置中完成,而不仅仅是解决问题。
  • 好吧,如果您将第一个索引解释为列索引(a[m][n] - 第 m 行的第 n 列),那么您可以只传递 a[m]。如果谈论 C++,您可以使用向量的向量,而不必担心必须传递列的长度。

标签: c++ c multidimensional-array


【解决方案1】:

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

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

【讨论】:

    【解决方案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 函数中,您可以访问具有如下步幅的数组的ith 元素:

    a[i * stride] = 42;
    

    就是这样。

    您可以使用相同的原理编写自己的 MatrixColumnView 类,该类包含此概念,并且可以传递到采用数组的模板化函数中。

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

    【讨论】:

      【解决方案3】:

      据我所知,C/C++中的多维数组存储实际上是一维数组,

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

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

      【讨论】:

      • 好的,所以我发现无法按照您提到的帖子中的说明完成。
      • 正如 Johny 所写 - 提供适当的迭代器就足够了。 C++ 世界中的迭代器是最常见的结构,所以我不会说没有“简单”的方法
      • 我同意你的观点,我也赞成@Johny 的回答 :) 我在想的是,我很难在不使用外部的情况下将列直接传递给 his_own_sort()库或预处理...
      猜你喜欢
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多