【问题标题】:C++ return array from function [duplicate]C ++从函数返回数组[重复]
【发布时间】:2012-02-03 10:33:54
【问题描述】:

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

该数组只能保存 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,或包含数组的结构,如果在编译时知道大小,效率会更高。
  • 这个特定的数组只有 一个 项的空间。一个数组存储的项目数量与它所说的一样多,不会比要求的多。
  • 无论您选择哪种方式,请确保您仍然学习指针,因为它们是一个非常重要的概念。
  • 为了强调 UncleBens 的这一点,当你声明一个数组时,你声明了它包含的项目数:在int a[N] 中,a 是一个包含N 元素的数组。当然后使用索引来引用元素时,您的索引从0N-1。地址a + N 存在,但它指的是数组末尾之后的地址,并且没有元素存在于那里。不应使用a[N] 访问它,否则守护程序会飞出你的鼻子。

标签: c++ arrays function return


【解决方案1】:

你不能在 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]my_array[1]),访问my_array[1] 超出范围(int foo[N]N 项目的位置,从索引 0 开始,然后到索引 N-1)。我猜你的意思是int my_array[2]

【讨论】:

  • 如果您可以访问当前的 C++ 编译器,该编译器实现了 C++11 中的移动语义,请熟悉它,因为它几乎可以完全消除此类简单解决方案带来的任何性能开销.
  • @filmor:实际上它可能没有什么不同,因为(至少在这样一个简单的示例中)编译器可能会进行 命名返回值优化 并完全省略副本(或在 C++11 中移动)无论如何
【解决方案2】:
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])

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      你不能从函数中返回一个数组,但是你可以为“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];
      }
      

      【讨论】:

        【解决方案5】:

        如果你的数组中有严格的 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;
        }
        

        【讨论】:

        • 你也可以在这里取一个值参数,你会得到免费的副本:)
        • @NiklasBaumstark:是的,我喜欢这样,但是 OP 不能传递 const 对,因为他需要修改它。
        • 我的意思更像是myfunction(int_pair ip)
        • @NiklasBaumstark:好的,我的意思是 const int_pair ip(std::make_pair(0,0)); myfunction(ip); 不会编译。
        • 那么在这种情况下你应该得到一个符合标准的编译器。
        【解决方案6】:

        您不能在 C 或 C++ 中返回数组。

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-05-09
            • 1970-01-01
            • 2011-09-19
            • 1970-01-01
            • 2013-06-14
            相关资源
            最近更新 更多