C++函数中返回数组

6

我需要将数组读入我的函数中,提取数据,然后从该函数返回数组。

该数组将仅包含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;
}

我已经阅读了关于指针等内容,但是感到非常困惑,希望能给一个非常基础的例子来解释这个问题!

谢谢!


@fefe:因为你可能想避免不必要的内存分配。如果大小在编译时已知,使用std::array或包含数组的结构体会更有效率。 - Mike Seymour
5
这个特定的数组只能容纳一个项目。数组存储的项目数量与其所声明的大小相同,不会比要求的多存储一个。 - UncleBens
无论你选择哪种方式,一定要确保你仍然学习指针,因为它们是一个非常重要的概念。 - Mike Webb
1
为了强调 UncleBens 的观点,在声明数组时,您需要声明它包含的项目数量:在 int a[N] 中,a 是一个包含 N 个元素的数组。然后使用索引来引用元素,从 0N-1 进行索引。地址 a + N 存在,但它指向数组末尾之外的位置,没有元素存在。不应该使用 a[N] 访问它,否则恶魔会从你的鼻子里飞出来。 - Matthieu M.
7个回答

9

在C++中,你不能返回内建数组。

如果你是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]my_array[1]),访问my_array[1]超出了边界(int foo[N]N个项,从索引0开始到索引N-1)。我想你真正的意思是int my_array[2]

1
如果您可以访问到一个实现了C++11的移动语义的当前编译器,那么请熟悉它,因为它将几乎完全消除任何与该简单解决方案带来的性能开销。 - filmor
2
@filmor:实际上可能没有什么区别,因为(至少在这样一个简单的例子中)编译器可能可以执行命名返回值优化并完全省略复制(或在C++11中移动)。 - Grizzly

7
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])

1
如果您只需要两个值,建议查看std::pair,毕竟这就是它的用途。它还具有适当的复制(在c++11中移动)语义,以使其正确工作。

1

你不能从函数中返回一个数组,但是你可以添加第二个参数作为“输出”数组:

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];
}

1
如果数组中严格只有两个元素,我建议使用 std::pair
typedef std::pair<int,int> int_pair;

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

你也可以在这里传递一个值参数,这样你就可以免费获得副本 :) - Niklas B.
@NiklasBaumstark:是的,我喜欢那个,但OP无法传递“const”对,因为他需要修改它。 - ali_bahoo
我的意思更像是 myfunction(int_pair ip) - Niklas B.
@NiklasBaumstark:好的,我的意思是const int_pair ip(std::make_pair(0,0)); myfunction(ip);将无法编译。 - ali_bahoo
那么在这种情况下,您应该使用符合标准的编译器。 - Niklas B.
@NiklasBaumstark:好的,好的,我现在明白了。它将被复制,无论const如何。修改答案。 - ali_bahoo

0

在C或C++中,你不能返回一个数组。

由于你正在使用C++,所以应该使用容器类而不是原始数组。 std::vectorboost::array 是很好的选择。


-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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接