作为一名Java程序员,我很难获得一个返回多维数组的函数。 我将如何用C ++编写代码?:
int[][] theFunction(){
int[][] var = new int[3][3];
// code
return var;
}
答案 0 :(得分:6)
在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
)更不灵活-in替代“从C继承”。
答案 1 :(得分: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<>
模板,它更安全,更安全。
希望这有帮助。
答案 2 :(得分:1)
正如其他人所说,你可以返回std::vector<std::vector<int> >
。值得指出的是,这是C ++的Return Value Optimization非常重要的情况 - 特别是,只要查看这段代码,您可能会认为在函数返回时必须复制整个向量向量(因为C ++函数的返回值是按值返回的)。但是这种由C ++明确允许并且几乎由任何编译器实现的优化允许函数以任何结构分配向量。
答案 3 :(得分:0)
std::vector<std::vector<int> > theFunction() {
std::vector<std::vector<int> > var;
// code
return var;
}
答案 4 :(得分:0)
你不会在C ++中使用C数组(在公式上看起来像Java数组),你可以使用vector
:
typedef std::vector<std::vector<int> > VecType;
VecType theFunction()
{
VecType var(3, std::vector<int>(3));
// code
return var;
}