首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中创建结构数组

在C++中创建结构数组
EN

Stack Overflow用户
提问于 2012-10-24 13:01:28
回答 4查看 10.2K关注 0票数 6

我在C++遇到了一个新手问题。

我有一个结构Edge,定义如下:

代码语言:javascript
运行
复制
struct Edge {
    int position[4];
    int average;
};

现在我需要创建很多这样的结构,为此我创建了一个帮助器-方法,它根据一些参数创建了这些结构的数组:

代码语言:javascript
运行
复制
Edge* createEdges(int some_parameters){
    Edge *edges = new Edge[8];

    for(int i = 0 ; i < 8; i++){
        Edge edge;
        edge.position[0] = 1; //fill the rest of the edge array in the same manner
        edge.average = 10;

        edges[i] = edge;
    }

    return edges;
}

但是,当我现在调用:Edge *edges = createEdges(int some_parameters)时,边缘数组中没有合理的数据(超出范围?)。

我想我在这里搞混了一些东西,但我更希望我能在不诉诸vector数据结构的情况下完成这个工作。这是正常的处理方法还是我自己声明边缘数组并将其传递给助手方法来填充它呢?

编辑:

首先,我要感谢大家的评论/提示/建议/建议/.他们帮助我发现了我很容易忽视的问题。

在我看到代码应该工作的回复之后,我也测试了简化的代码(这是我应该在第一位做的事情),令人惊讶的是,它成功了!因此,我检查了一下为什么我的真正的代码不能工作,而简化的版本却起作用了。

我真正的代码是这样的:

代码语言:javascript
运行
复制
Edge* createEdges(int some_parameters){
     Edge* edges = new Edge[8];
     if(some_parameter != 0){
          //create the edges as in my 1st snippet
          return NULL; //doh, should return edges here !
     } else { 
          return NULL;
     }
}

我之所以没有看到只返回错误的值(NULL),是因为调试器向我展示了一些0xf6f6f6地址,其中包含了edge.position的一些负值(我不太明白,它应该只向我显示0x000000,也许我只是在想象)。

总之,这是一个重要的教训,为什么永远不要在凌晨3点以后编码,没有什么好的结果!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-24 13:16:14

下面是一个修改过的版本,它在函数中创建边缘,并返回包含所有创建边缘的向量。

代码语言:javascript
运行
复制
#include <iostream>
#include <vector>

struct Edge {
    int position[4];
    int average;
};

std::vector< Edge > createEdges(int some_parameters){
    std::vector< Edge > edges( 8 );

    for(int i = 0 ; i < 8; i++){
        const Edge edge{ { 1, 0, 0, 0 }, 10 };

        edges[i] = edge;
    }

    return edges;
}


int main()
{
    auto e( createEdges(5));

    std::cout<<e[0].average<<std::endl;
}

有几处修改:

  1. 我不是分配一个边数组,而是返回指针,而是返回向量。
  2. 创建边缘对象和初始化边缘对象的方式(我认为这就是我们所要求的)。
票数 1
EN

Stack Overflow用户

发布于 2012-10-24 13:07:52

是C++ use std::vector

代码语言:javascript
运行
复制
std::vector<Edge> createEdges(int some_parameters){
    std::vector<Edge> edges;

    for(int i = 0 ; i < 8; i++){
        Edge edge;
        edge.position[0] = 1;
        edge.average = 10;
        edges.push_back(edge);
    }

    return edges;
}
票数 3
EN

Stack Overflow用户

发布于 2012-10-24 13:19:31

你这里的一切都很好。我感觉你忘记了,当你打电话的时候

代码语言:javascript
运行
复制
Edge *edges = createEdges(int some_parameters)

该边变量是指向列表中第一个元素的指针。如果你要那么做:

代码语言:javascript
运行
复制
edges[0]

或者:

代码语言:javascript
运行
复制
edges[1]

您将看到这些值是不同的,现在需要循环通过这些值来访问数组。请记住,在循环期间,您不会传递数组的末尾。这就是为什么大多数人说要使用向量,因为迭代器可以使用更多的安全特性。

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

https://stackoverflow.com/questions/13049769

复制
相关文章

相似问题

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