C++ 如何创建完全动态的嵌套向量?

C++ 如何创建完全动态的嵌套向量?,c++,vector,C++,Vector,我需要创建一个向量(primary),每个节点都有另一个向量成员(secondary)。必须动态调整主向量和次向量的大小。我已经玩了一段时间,并提出了一些“几乎没有”的解决方案(如下面的一个),但我不能让它们中的任何一个工作 我需要能够通过执行类似于primary.push_back(primary_节点)的操作,随时(而不仅仅是在创建时)添加到主向量。此外,我需要能够在任何时候(不仅仅是在创建时)使用迭代器将这些节点中的任何一个作为目标,并将其添加到它所指向的向量中。示例:primary.be

我需要创建一个向量(primary),每个节点都有另一个向量成员(secondary)。必须动态调整主向量和次向量的大小。我已经玩了一段时间,并提出了一些“几乎没有”的解决方案(如下面的一个),但我不能让它们中的任何一个工作

我需要能够通过执行类似于
primary.push_back(primary_节点)
的操作,随时(而不仅仅是在创建时)添加到主向量。此外,我需要能够在任何时候(不仅仅是在创建时)使用迭代器将这些节点中的任何一个作为目标,并将其添加到它所指向的向量中。示例:
primary.begin()->node\u head.push\u back(secondary\u node)
。以下是我所描述内容的可视化:

同样,在任何时候,我都需要能够添加到主(黑色)向量或任何一个次(红色)向量。我需要能够通过黑色节点选择红色向量

相关代码:

struct secondaryNode
{
    char *name;
    secondaryNode *next;
};

struct primaryNode
{
    char* typeName;
    std::vector<secondaryNode> *node_head; //pointer to secondary vector
};

//global primary vector
std::vector<primaryNode> primary_list;

void main() {
    struct primaryNode* primary_temp;
    primary_temp = ALLOC(struct primaryNode);
    primary_temp->typeName = strdup("primary temp");

    //initialize secondary vector
    std::vector<secondaryNode> *secondary_list = new std::vector<secondaryNode>;
    primary_temp->node_head = secondary_list;

    //first secondary node
    struct secondaryNode* foo;
    foo = ALLOC(struct secondaryNode);
    foo->name = strdup("\nfoo");
    secondary_list->push_back(*foo);

    primary_list.push_back(*primary_temp); //push primary node after giving it a secondary node

    printf("\n%d", secondary_list->size()); //outputs 1
    printf("%s", secondary_list->begin()->name); //outputs "foo"
    printf("%s", primary_list.begin()->node_head->begin()->name); //outputs "foo"

    //second secondary node
    struct secondaryNode* bar;
    bar = ALLOC(struct secondaryNode);
    bar->name = strdup("\nbar");
    secondary_list->push_back(*bar);

    printf("\n%d", secondary_list->size()); //outputs 2
    printf("\n%s", secondary_list->end()->name); //outputs NULL
    printf("\n%s", primary_list.begin()->node_head->end()->name); //outputs NULL
}

你的大部分困惑来自于到处使用指针。在C++中,你不必经常使用它们。此代码可以在没有任何指针的情况下重写:

struct secondaryNode
{
    std::string name;
};

struct primaryNode
{
    std::string typeName;
    std::vector<secondaryNode> secondaryNodes;
};

//global primary vector
std::vector<primaryNode> primary_list;

int main() {
    primaryNode primary_temp;
    primary_temp.secondaryNodes.push_back(secondaryNode{"\nfoo"});

    primary_list.push_back(primary_temp); //push primary node after giving it a secondary node

    std::cout << primary_list[0].secondaryNodes.size() << std::endl; //outputs 1
    std::cout << primary_list[0].secondaryNodes[0].name << std::endl; //outputs "foo"

    //second secondary node
    primary_list[0].secondaryNodes.push_back(secondaryNode{"\nbar"});

    std::cout << primary_list[0].secondaryNodes.size() << std::endl; //outputs 2
    std::cout << primary_list[0].secondaryNodes[0].name << std::endl; //outputs "foo"
    std::cout << primary_list[0].secondaryNodes[1].name << std::endl; //outputs "bar"
}

end()?为什么需要
secondaryNode::next
?对不起,这里不需要它。那是另一次尝试,我忘了去掉那一点。这段代码实际上是我试图避免的(嵌套链表),我刚刚尝试了一下,效果很好。非常感谢。我花了很多时间在这上面。
struct secondaryNode
{
    std::string name;
};

struct primaryNode
{
    std::string typeName;
    std::vector<secondaryNode> secondaryNodes;
};

//global primary vector
std::vector<primaryNode> primary_list;

int main() {
    primaryNode primary_temp;
    primary_temp.secondaryNodes.push_back(secondaryNode{"\nfoo"});

    primary_list.push_back(primary_temp); //push primary node after giving it a secondary node

    std::cout << primary_list[0].secondaryNodes.size() << std::endl; //outputs 1
    std::cout << primary_list[0].secondaryNodes[0].name << std::endl; //outputs "foo"

    //second secondary node
    primary_list[0].secondaryNodes.push_back(secondaryNode{"\nbar"});

    std::cout << primary_list[0].secondaryNodes.size() << std::endl; //outputs 2
    std::cout << primary_list[0].secondaryNodes[0].name << std::endl; //outputs "foo"
    std::cout << primary_list[0].secondaryNodes[1].name << std::endl; //outputs "bar"
}
secondary_list->end()->name