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

5
作为一名Java程序员,我很难让一个函数返回一个多维数组。你会如何在C++中编写这个代码?
int[][] theFunction(){
  int[][] var = new int[3][3];
  // code
  return var;
}

1
这个能用吗?你试过了吗?返回值可以是int类型吗? - duffymo
5个回答

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 :: 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<>模板,它更安全,绝对更舒适。希望这可以帮到你。

1

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


0
std::vector<std::vector<int> > theFunction() {
    std::vector<std::vector<int> > var;
    // code
    return var;
}

0
你不会在C++中使用C数组(其符号看起来像Java数组),而是应该使用vector
typedef std::vector<std::vector<int> > VecType;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接