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

时间:2016-03-25 23:18:13

标签: c++ vector

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

我需要通过执行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)

1 个答案:

答案 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的原因。