C++中堆内存向量的初始化

ivqmmu1c  于 2023-01-10  发布在  其他
关注(0)|答案(3)|浏览(159)

我很困惑
第一个月
vector<node> *children = new vector<node>;
vector<node*> children = new vector<node>;
我只想实现一个通用的树数据结构

struct node{
    int index;
    vector<int> sol;
    vector<node *> children;
};

node *createNode(int indexVal)
{
    node* n = new Node();
    n->index = indexVal;

    vector<int>* soll = new vector<int>;
    n->sol = soll;

    vector<node>* childrenn = new vector<node *>;
    n->children = childrenn;

    return n;
}

void addChildren(node* curr, node* child)
{
//something like
    curr->push_back(child);
};

我希望能够在任何我想要的范围内修改sol和子向量,假设我有一个节点指针
我很困惑,这三个给出的哪一个会是最好的结果,它们会有什么不同?还有,这将如何扩展到2-d矢量?

mpgws1up

mpgws1up1#

你有这个:

vector<node *> children;

这很好,它是一个指向node s的指针向量。你不用new来创建它,只要你有一个node,它就会自动创建。

node *createNode(int indexVal)
{
    node* n = new node();
    n->index = indexVal;
    return n;
}

nodesolchildren向量直接在它里面。

yizd12fk

yizd12fk2#

关于

vector<int>* children = new vector<int>;

以及

vector<int> *children = new vector<int>;

They are the same. Both are declaring a pointer to a vector< int>. The only difference is the position of the *. Some people think it is more readable when the * is closer to the type name. Others prefer the * closer to the variable name.
虽然我更喜欢第一种方法,它使 * 更接近类型,但第二种方法更正确,因为在C++中,解析器将 * 与变量而不是类型相关联,因此可以声明如下内容:

vector<int> *ptr1, var2, *ptr2, *ptr3, var3

This would declare variables ptr1, ptr2 and ptr3 as being pointers to vector< int> while var2 and var3 would be normal variables. If you use the first writing style and write:

vector<int>* ptr1, var2, ptr2, ptr3, var3

如果你认为所有变量都是指针,那你就错了,只有ptr1是指针,其他变量都是普通变量。
现在这个

vector<node*> children = new vector<node>;

是完全不同的事情。在前两个中,你声明了一个指向int数组的指针,而在第三个中,你声明了一个指向int的指针数组。另外,注意你在new中的打字错误,你忘记了 *。为了工作,它需要是(注意结尾的 *)

vector<node*> children = new vector<node*>;

关于您的代码,sol似乎是存储在节点中的数据,children包含指向其他节点的指针。

struct node{
    int index;
    vector<int> sol;
    vector<node *> children;
};

还有这里

node *createNode(int indexVal)
{
    node* n = new Node();
    n->index = indexVal;

    /* This is wrong and unecessary. As sol is not a pointer, when 
       you do a new above, the new already allocates the sol so that
       you don't need to allocate again here */
    vector<int>* soll = new vector<int>; // remove this
    n->sol = soll; // not needed

    /* Now here you have some typos. It should be vector<node *> and not 
       vector<node>* */
    vector<node>* childrenn = new vector<node *>;
    n->children = childrenn;

    return n;
}

我没有对树本身做任何评论,因为你发布的只是一个框架代码,而不是真正的代码。我假设你知道树,只是想知道关于指针和向量的C++的东西。如果你还不知道树,仔细看看你的代码,因为有一些部分是不太正确的。

nfs0ujit

nfs0ujit3#

vector<node>* children = new vector<node>;vector<node> *children = new vector<node>;相同,并且是指向节点向量的指针,但是vector<node*> children = new vector<node>;不正确,因为您的变量不是指针类型。要从堆分配内存,我们使用关键字new,并且变量应该是指针类型。vector<node*> children;是指向节点的指针向量,但是这将从堆栈而不是从堆分配内存

相关问题