【问题标题】:Taking integer as parameter and returning an array以整数为参数并返回一个数组
【发布时间】:2011-05-27 16:28:08
【问题描述】:

我想创建一个函数,它以整数作为参数,并在 C++ 中返回一个数组。这是我想到的伪代码:

function returnarray(integer i)
{
    integer intarr[i];

    for (integer j = 0; j < i; j++) { intarr[j] = j; }

    return intarr;
}

我尝试了将 returnarray 声明为 function* 返回指针的常用方法,但是我不能将整数作为参数。我也不能将 j 分配给 intarr[j]。我真的很想避免创建一个指向 int 的指针,这样我就可以使用参数了。

有没有办法做到这一点,并且能够将 j 分配给 intarr[j] 而无需为其创建指针?

编辑:

忘了写我想避免使用向量。我只有在真的需要时才使用它们! (我的理由是我的)。

谢谢:D

【问题讨论】:

  • 您需要说明您希望避免使用向量的原因。向量提供了一个明显的解决方案;回答者需要知道您对潜在解决方案施加了哪些限制。
  • @MisterSir:如果你想提高你对 C++ 的理解,你需要解决一个你还不理解的问题——例如,implementing向量。用奇怪的解决方案解决简单的问题不会以任何有意义的方式提高您对语言的理解。
  • 怎么样:“我不想使用向量的原因是我正在实施向量替换作为学习练习”。那会更清楚。不过,我仍然不明白您要做什么,因为 vector 接口的任何部分都不需要您必须返回一个数组。
  • @MisterSir:“只是一个简单的出路”?!开车或乘坐公共交通工具“只是一种简单的出路”,我希望你能走遍你的国家,这样你就可以“真正学到一些东西”,而不是把事情做好。
  • @MisterSir:因为手动进行资源管理不是惯用的 C++。从malloc 切换到new 不会让你成为C++ 程序员,你的代码基本上还是C。

标签: c++ arrays return


【解决方案1】:

一般来说,我并不是特别推荐这种方法,但是您可以使用模板来执行此操作,而无需诉诸动态内存分配。不幸的是,你不能从函数返回数组,所以你需要返回一个包含数组的结构。

template <int N>
struct int_array_type {
    int ints[N];
};

template <int N>
int_array_type<N> returnarray() {
    int_array_type<N> a;
    for (int i = 0; i < N; ++i)
        a.ints[i] = i;
    return a;
}

...

int_array_type<10> u = returnarray<10>();
std::copy(u.ints, u.ints+sizeof(u.ints)/sizeof(u.ints[0]),
    std::ostream_iterator<int>(std::cout, "\n"));

【讨论】:

    【解决方案2】:

    在使用优秀的@DeadMG 的解决方案之前,请注意两点:

    1) 你永远不想避免向量。如果v 是一个向量,并且你真的想要一个指针,你总是可以通过写&amp;v[0] 来获得一个指向第一个元素的指针。

    2) 你不能返回一个数组。您将返回一个指向新内存区域的指针,一旦完成,您就必须删除它。向量只是具有自动删除功能的数组,因此不会泄漏内存。

    【讨论】:

      【解决方案3】:

      您需要使用动态内存。像这样的

      int* returnArray(int size) {
          int* array = new int[size];
          for(int i = 0; i < size; ++i)
              array[i] = i;
          return array;
      }
      

      【讨论】:

      • 不要忘记初始化数组中的值(根据发布的伪代码):)
      • -1 这不好,因为它教初学者使用原始指针和new 和delete,手动处理生命周期。它只是长时间停止倾斜,因为初学者必须处理大部分无关紧要的问题。然后这个人必须忘记所有这些东西。
      • 我不同意。学习如何使用原始指针是程序员可能拥有的最重要的技能之一。我在 Digipen 第 3 周被教过指针(不是我立即理解它们)
      • @EnabrenTane:学习如何使用原始指针很重要,但它们并不总是初学者的最佳起点。通常最好先学习如何使用 vector 之类的东西,然后再考虑它是如何在内部实现的。
      • @Maxpm: 不,delete p 将导致未定义的行为。该阵列必须通过delete[] p 释放。教初学者std::vector 的用法或未定义行为的概念,您认为哪个更容易?
      【解决方案4】:

      你不能返回一个堆栈分配的数组——它会超出范围并且内存被释放。此外,C++ 不允许堆栈分配的可变长度数组。您应该使用 std::vector。

      std::vector<int> returnarray(int i) {
          std::vector<int> ret(i);
          for(int j = 0; j < i; j++) ret[j] = j;
          return ret;
      }
      

      【讨论】:

      • 如果您对 STL Vectors 感到满意,那就太好了。如果您更熟悉 C 代码,我的回答更“老派”,这是一种口味问题,每种方法都有其优缺点
      • +1 以获得简洁的答案,但我想知道返回 const std::vector&lt;int&gt; 是否有任何额外的好处?
      • @EnabrenTane:不,这根本不是真的。你的方法有一大堆破坏程序的缺点。比如,没有边界检查,没有异常安全,没有自动释放,没有语义执行。它的唯一优势是交叉编译器/跨语言链接能力。每个 C++ 程序员都应该对 STL 向量感到满意。该答案令人难以置信的失败是这些 C++ 概念存在的全部原因。 @ig2r:不,没有。
      • C "速度第一,有时间的话安全"
      • @Enabren:除非你可以使用矢量同时获得速度和安全性。
      【解决方案5】:

      您的代码甚至不是有效的 c++,所以我假设您完全是初学者

      使用std::vector

      #include <vector>
      
      std::vector<int> yourFunction( int n )
      {
          std::vector<int>  result;
          for( int i = 0;  i < n;  ++i )
          {
              result.push_back( i );
          }
          return result;
      }
      

      免责声明:编译器未触及的代码。

      干杯,

      【讨论】:

      • 这只是伪代码,旨在显示我正在尝试做的事情。我可以只使用向量,但我也忘了写我想避免使用向量。可以使用它们,但这只会使我的代码更加复杂,因为我需要直接处理数组。不过还是谢谢。
      • @MisterSir:使用std::vector 将使您的代码更简单,而不是更复杂。首先,不可能有一个返回数组的函数,所以你必须做 something else。返回std::vector 在几乎所有方面都是最简单的选择。
      • 考虑 result.reserve(n) 。否则,对于较大的 n 值, push_back 的性能会很差。根据实现,向量通常会增长约 1.5 到 2 倍。这意味着您将不得不反复重新分配和 memcpy。
      • @EnabrenTane:这里不需要使用reserve,因为所需的大小可以简单地用作构造函数参数(参见@DeadMG 的答案)。我选择说明 push_back 是因为 OP 可以从中学到一些有用的东西。我选择不说明过早的优化,因为 OP 会从中学到错误的东西。但事实证明,OP 没有从任何std::vector 答案中学习。因此,编写好的答案的努力是徒劳的。
      • @downvoter:请说明你投反对票的原因,以便其他人知道答案有什么问题,或者为什么你的投反对票很愚蠢。
      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 2015-09-17
      • 1970-01-01
      • 2016-07-10
      • 2021-06-15
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      相关资源
      最近更新 更多