我需要创建一个向量(主要),每个节点都有另一个向量成员(辅助)。主要和辅助向量都必须动态调整大小。我已经玩了一段时间了,并提出了一些“差不多”的解决方案(如下面的那个),但我不能让它们中的任何一个起作用。
我需要通过执行primary.push_back(primary_node)
之类的操作,随时(不仅仅是在创建时)添加到主矢量。另外,我需要能够在任何时候(不仅仅是在创建时)使用迭代器来定位任何一个节点,并添加到它指向的向量。示例:primary.begin()->node_head.push_back(secondary_node)
。这是我所描述的内容的可视化:http://i.imgur.com/g2BCbl9.png
同样,在任何时候我都需要能够添加到主(黑色)矢量或任何一个辅助(红色)矢量。我需要能够通过黑色节点选择红色矢量。
相关代码:
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
}
此代码的输出为:
1
foo
foo
2
(null)
(null)
答案 0 :(得分:0)
你的大多数困惑来自于遍布整个地方的指针。在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"
}
代码中的另一个错误是:
secondary_list->end()->name
end()
是向量结尾的下一个元素的迭代器,因此取消引用它是未定义的行为,这就是你在那里看到NULL的原因。