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