首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中返回多维数组的函数

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

Stack Overflow用户
提问于 2012-12-21 01:50:59
回答 5查看 2.7K关注 0票数 5

作为一名Java程序员,我很难获得返回多维数组的函数。我如何在C++中对此进行编码?:

代码语言:javascript
复制
int[][] theFunction(){
  int[][] var = new int[3][3];
  // code
  return var;
}
EN

回答 5

Stack Overflow用户

发布于 2012-12-21 01:52:28

在C++中,最简单的方法如下所示:

代码语言:javascript
复制
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“继承”而来的灵活性较差的内置替代品。

票数 6
EN

Stack Overflow用户

发布于 2012-12-21 02:00:59

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

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

代码语言:javascript
复制
int v[] = { 1, 2, 3 };
int * ptr = v;

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

代码语言:javascript
复制
for( ; ptr < ( v + 3 ); ++ptr) {
     std::cout << *ptr << stD::endl;
}

并且该指针可以被返回:

代码语言:javascript
复制
int * vectorCreator(int max)
{
    int * v = new int[max];
    return v;
}

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

代码语言:javascript
复制
auto_ptr<int> vectorCreator(int max)
{
    int * v = new int[max];
    return auto_ptr<int>( v );
}

按照这个方向工作的是C++标准库的一部分,您可以在其中使用vector<>模板,它更安全,也更舒适。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2012-12-21 01:56:29

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13977737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档