作为一名 Java 程序员,我很难获得一个返回多维数组的函数。我将如何用 C++ 编写代码?:
int[][] theFunction(){
int[][] var = new int[3][3];
// code
return var;
}
作为一名 Java 程序员,我很难获得一个返回多维数组的函数。我将如何用 C++ 编写代码?:
int[][] theFunction(){
int[][] var = new int[3][3];
// code
return var;
}
在 C++ 中,最简单的方法是这样的:
std::vector<std::vector<int> > theFunction() {
std::vector<std::vector<int> > var(3, std::vector<int>(3));
// code
return var;
}
您需要包含<vector>
才能编译。与 Java 通用容器不同,C++ 模板容器不会产生将原语包装到对象中的成本,因此它们可以在性能和内存消耗方面保持极高的效率,同时提供大量额外的灵活性。
通常,您应该更喜欢 C++ 风格的容器(std::vector
, std::set
, std::map
, 和 C++11 中的 ,std::array
)而不是从 C“继承”的不太灵活的内置替代品。
简而言之,在 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<>
模板,这更安全,也更舒适。
希望这可以帮助。
正如其他人所说,您可以返回一个std::vector<std::vector<int> >
. 值得指出的是,在这种情况下,C++ 的返回值优化可能非常重要——特别是,仅查看这段代码,您可能会认为函数返回时必须复制整个向量的向量(因为 C++函数的返回值是按值返回的)。但是这种优化是 C++ 明确允许的,并且几乎可以由任何编译器实现,它允许函数将向量分配到它将返回到的任何结构中。
std::vector<std::vector<int> > theFunction() {
std::vector<std::vector<int> > var;
// code
return var;
}
你不会在 C++ 中使用 C 数组(在符号上看起来像 Java 数组),你会使用vector
:
typedef std::vector<std::vector<int> > VecType;
VecType theFunction()
{
VecType var(3, std::vector<int>(3));
// code
return var;
}