C ++从函数返回数组

时间:2012-01-05 15:43:01

标签: c++ arrays function return

我需要在数组中读取我的函数,提取数据,然后从函数中返回一个数组。

数组只能保存2个值。

这就是我想要的概念:

int myfunction(int my_array[1])
{
    int f_array[1];
    f_array[0] = my_array[0];
    f_array[1] = my_array[1];

    // modify f_array some more

    return f_array;
}

我已经阅读了有关指针等的内容,但我们已经非常困惑,并希望了解如何最好地解决这个问题的一个非常基本的例子!

谢谢!

8 个答案:

答案 0 :(得分:9)

你不能在c ++中返回n个内置数组。

如果你是c ++的新手并且对指针感到困惑,你真的不想使用数组(至少不是内置数组)。请改为使用std::vector<int>,或者如果您只有一定数量的元素并希望表达(并且确实需要更好的性能),请使用boost::array<int, N>。(或者甚至std::array<int, N>,如果您C++11中的程序(如果你不知道你是否在C++11机会中编程,那么你是不是)。 例如:

std::vector<int> myfunction(const std::vector<int>& my_array) {
  std::vector<int> f_array;
  for(int i = 0; i < my_array.size(); ++i)
    f_array.push_back(my_array[i]);
  return f_array;
}

boost::array<int, 2> myfunction(const boost::array<int, 2>& my_array) {
  boost::array<int, 2> f_array;
  f_array[0] = my_array[0];
  f_array[1] = my_array[1];
  return f_array;
}

然后,您可以使复制代码更简单(查找您决定使用的任何类的构造函数和成员函数,以及STL算法)。例如:

std::vector<int> myfunction(const std::vector<int>& my_array) {
  std::vector<int> f_array(m_array);
  ...
  return f_array;
}

另外一点,您的代码中有一个错误:您将my_array定义为int my_array[1],这意味着它是一个包含一个元素的数组,但您可以访问两个元素(my_array[0]和{{ 1}}),对my_array[1]的访问超出范围(my_array[1]int foo[N]个项目,从索引N开始,然后转到索引0 )。我假设你真的是N-1

答案 1 :(得分:4)

std::array<int,2> myfunction(int * my_array)
{
    std::array<int,2> f_array;
    f_array[0] = my_array[0];
    f_array[1] = my_array[1];

    // modify f_array some more

    return f_array;
}

请注意,作为参数,int my_array[1]int my_array[1000]int my_array[]int * my_array完全相同。它只是一个指针,大小值毫无意义。这不适用于常规数组声明,只适用于参数。

为了确保您只传递大小为2的数组,您可以通过引用获取数组:

std::array<int,2> myfunction(int (&my_array)[2])

答案 2 :(得分:1)

如果您只需要两个值,我会看一下std::pair,毕竟,这就是它的用途。它还具有正确的副本(在c ++ 11中移动)语义,以使其正常工作。

答案 3 :(得分:1)

如果您在阵列中严格使用2个元素,我建议std::pair

typedef std::pair<int,int> int_pair;

int_pair myfunction(int_pair ip)
{
  ip.first *= 0.12;
  ip.second -= 355; 
  return ip;
}

答案 4 :(得分:0)

您无法使用C或C ++返回数组。

当您使用C ++时,请使用容器类而不是原始数组。 std::vectorboost::array将是不错的选择。

答案 5 :(得分:0)

您无法从函数返回数组,但可以为“out”数组添加第二个参数:

void foo(int array_in[], int array_out[], int array_size)
{
    for (int i = 0; i < array_size; i++)
        array_out[i] = array_in[i];
}

答案 6 :(得分:-1)

具有两个值的数组应声明为int my_array[2]。无论如何,您无法按值复制数组。你说你在对象中只有两个整数。所以我建议你改用pair<int,int>

using namespace std;
pair<int,int> myfunction(pair<int,int> my_array)
{
  pair<int,int> f_array;
  f_array.first = my_array.first;
  f_array.second = my_array.second;

  // modify f_array some more

  return f_array;
}

答案 7 :(得分:-1)

C ++不允许将整个数组作为参数返回给函数。但是,您可以通过指定不带索引的数组名称来返回指向数组的指针。

要从函数返回单维数组,您必须声明一个返回指针的函数,如下所示:

int * myfunc(){
      static int arr[size_of_array];
      /*

       code for manipulation of arr

       */
    return arr;
   }

一旦我们离开功能块,函数体内声明的变量就会被销毁。因此,我们需要将int arr[size_of_arr]声明为static。这将在堆上为int arr[size_of_arr]分配内存,并确保在我们离开功能块时它不会被销毁。

调用myfunc()的方法如下所述:

int *myarray;
myarray=myfunc();

现在myfunc()返回的数组存储在myarray