【问题标题】:Passing an array of unknown size by reference in c++在 C++ 中通过引用传递未知大小的数组
【发布时间】:2014-04-13 12:11:23
【问题描述】:

我有 4 个排序的整数数组,我正在尝试将它们合并为一个巨大的排序数组。

我将 A 和 B 合并在一起,这给了我另一个名为 X 的 int 数组 然后我将 C 和 D 合并在一起,这给了我另一个名为 Y 的 int 数组 最后我将 X 和 Y 合并在一起得到 Z,这是最终的产品。

合并函数每次都做同样的事情,只是将结果存储到我想通过引用传入的不同数组中。

我想做这样的事情:

void mergeSort(int arr1[], int arr2, int &result[]){
    ...
}

但我收到错误“不允许引用数组”。最好的方法是什么?

【问题讨论】:

  • 您可以使用本文中提供的任何解决方案吗? stackoverflow.com/questions/12791266/…
  • 你为什么不使用std::vectors?
  • @Michał Góral: std::array<int, Size> 并且仅在 C++11 中...
  • 数组名其实是指针,所以你不必通过引用传递(可以说数组是通过引用传递的,默认情况下),就像你传递int arr1[]一样,传递结果数组那样
  • 如果你真的不知道数组的大小是不可能的(即它只能由用户在运行时确定)。但是,如果您知道大小,尽管它是使用模板的变体,但您可以这样做。

标签: c++ arrays merge


【解决方案1】:
void mergeSort( int *arr1, int *arr2, int sizeOfArray, int *result[] )
{
...
}

【讨论】:

    【解决方案2】:

    在 C++ 中通过引用传递数组的语法是

    int (&result)[size]
    

    请注意,您需要在编译时知道size。这可能不是你想在这里做的,我建议使用vector<int>

    【讨论】:

    • 为什么在c++14中允许在函数中使用VLA但不允许作为参数传递给函数?
    【解决方案3】:

    我认为上面的答案为您提供了比您正在做的更好的解决方案。但是,如果您绝对坚持采用数组(通过引用并希望保持“未指定”大小),请执行以下操作:

    template <unsigned int SIZE> void mergeSort(int arr1[], int arr2, int (&result)[SIZE]){
    }
    

    然后您可以将任何大小的数组传递给它,模板参数推导过程将在编译时计算出大小。 请注意,如果您的实现支持 VLA,这将不适用于 VLA。

    【讨论】:

      【解决方案4】:

      你不能这样写函数,因为数组即使有相同类型但大小不同的元素也是不同的类型。

      你需要写一个模板函数

      例如

      template <size_t N1, size_t N2>
      
      void mergeSort( int ( &arr1 )[N1], int ( &arr2 )[N2], int ( &result )[N1+N2])
      {
          ...
      }
      

      否则你需要传递给数组的函数大小。例如

      void mergeSort( int arr1[], size_t n1, int arr2[], size_t n2, int result[])
      {
          ...
      }
      

      在这种情况下,假设数组结果的大小至少不小于n1 + n2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 2014-02-22
        • 2015-06-07
        • 2010-10-06
        • 2014-04-05
        • 2013-11-07
        • 2010-11-09
        相关资源
        最近更新 更多