作为一名Java程序员,我很难让一个函数返回一个多维数组。你会如何在C++中编写这个代码?
int[][] theFunction(){
int[][] var = new int[3][3];
// code
return var;
}
int[][] theFunction(){
int[][] var = new int[3][3];
// code
return var;
}
std::vector<std::vector<int> > theFunction() {
std::vector<std::vector<int> > var(3, std::vector<int>(3));
// code
return var;
}
<vector>
以使其编译。与Java通用容器不同,C ++模板容器不会将基本类型封装为对象的成本,因此它们在性能和内存消耗方面非常高效,同时提供了更大的灵活性。std :: vector
、std :: set
、std :: map
,以及在C ++ 11中使用std :: array
),而不是从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 );
}
vector<>
模板,它更安全,绝对更舒适。希望这可以帮到你。正如其他人所说,您可以返回一个std::vector<std::vector<int> >
。值得指出的是,这是C++中返回值优化非常重要的一种情况--特别是仅仅看这段代码,您可能会认为整个向量的向量在函数返回时必须被复制(因为C++函数的返回值是按值返回的)。但是这种优化,它是由C++明确允许并且几乎所有编译器都实现了,允许函数在将向量分配到任何结构中返回。
std::vector<std::vector<int> > theFunction() {
std::vector<std::vector<int> > var;
// code
return var;
}
vector
:typedef std::vector<std::vector<int> > VecType;
VecType theFunction()
{
VecType var(3, std::vector<int>(3));
// code
return var;
}