在 C++ 中返回多维数组的函数

Posted

技术标签:

【中文标题】在 C++ 中返回多维数组的函数【英文标题】:Function that returns multidimensional array in C++ 【发布时间】:2012-12-08 07:14:27 【问题描述】:

作为一名 Java 程序员,我很难获得一个返回多维数组的函数。 我将如何用 C++ 编写代码?:

int[][] theFunction()
  int[][] var = new int[3][3];
  // code
  return var;

【问题讨论】:

这行得通吗?你试过了吗?返回值可以是 **int 吗? 【参考方案1】:

在 C++ 中,最简单的方法是这样的:

std::vector<std::vector<int> > theFunction() 
    std::vector<std::vector<int> > var(3, std::vector<int>(3));
    // code
    return var;

您需要包含&lt;vector&gt; 才能编译。与 Java 通用容器不同,C++ 模板容器不会产生将原语包装到对象中的成本,因此它们可以在性能和内存消耗方面保持极高的效率,同时提供大量额外的灵活性。

一般来说,您应该更喜欢 C++ 风格的容器(std::vectorstd::setstd::map,在 C++11 中为std::array),而不是从 C“继承”的不太灵活的内置替代品.

【讨论】:

【参考方案2】:

简而言之,在 C 中(比方说,你在 C++ 中使用的方言 [C++ 是 C 的超集,有一些修改])你不能从函数返回向量或矩阵。不过,您可以返回一个指针(这可能对您没有太大帮助)。

在 C 和 C++ 中,向量的名称(让我们简化一下)是指向第一个位置的指针,所以:

int v[] =  1, 2, 3 ;
int * ptr = v;

指针是一个内存地址,您可以使用它来遍历所有元素(尽管它可能很危险):

for( ; ptr < ( v + 3 ); ++ptr) 
     std::cout << *ptr << stD::endl;

并且可以返回那个指针:

int * vectorCreator(int max)

    int * v = new int[max];
    return v;

请注意,在这种情况下,调用者负责在完成后释放向量。这是您可以使用auto_ptr 解决的问题(新标准已过时,一旦您的编译器允许,您应该使用unique_ptr)。

auto_ptr<int> vectorCreator(int max)

    int * v = new int[max];
    return auto_ptr<int>( v );

在这个方向上,C++ 标准库的一部分工作,您可以在其中使用vector&lt;&gt; 模板,它更安全,也更舒适。

希望这会有所帮助。

【讨论】:

【参考方案3】:

正如其他人所说,您可以返回std::vector&lt;std::vector&lt;int&gt; &gt;。值得指出的是,在这种情况下,C++ 的Return Value Optimization 可能非常重要——特别是,仅查看这段代码,您可能会认为当函数返回时必须复制整个向量向量(因为 C++函数的返回值是按值返回的)。但是这种优化是 C++ 明确允许的,并且几乎可以由任何编译器实现,它允许函数将向量分配到它将返回到的任何结构中。

【讨论】:

【参考方案4】:
std::vector<std::vector<int> > theFunction() 
    std::vector<std::vector<int> > var;
    // code
    return var;

【讨论】:

【参考方案5】:

你不会在 C++ 中使用 C 数组(在符号上看起来像 Java 数组),你会使用 vector:

typedef std::vector<std::vector<int> > VecType;

VecType theFunction()

  VecType var(3, std::vector<int>(3));
  // code
  return var;

【讨论】:

以上是关于在 C++ 中返回多维数组的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将多维动态数组传递给C++中的函数

C++多维数组逗号索引地址

如何将零填充的多维数组传递给 C++ 中的函数?

c++ - 如何将多维数组传递给没有内部维度的函数? [复制]

将一个多维数组初始化为一个类 c++中的成员

将一个多维数组初始化为一个类 c++中的成员