安全存储和重用矢量迭代器值?

时间:2015-01-15 08:30:45

标签: c++ vector data-structures stl iterator

我正在使用图形构建C ++程序。我正在使用类的向量。问题是当我将类的新对象插入向量时,迭代器的先前值开始指向一些垃圾值。我的课程如下:

class LinkedList
{
    public:
    int node;
    list <children> child;
    vector <vector <LinkedList>::iterator > pl; // it store the iteration values of parent of node
    vector <vector <LinkedList>::iterator > cl; // it store the iteration values of childof node
};
class children
{
    public:
    int dest;
    string label;
};

存储和重用迭代器值的安全性是多少?

以下功能的工作原理如下:

首先,它将找到每个节点的父节点和子节点,并分别存储迭代结果。

其次它是图形的子节点(没有更节点子节点的节点)。

当它尝试将子节点插入图形时,其他节点的迭代变为垃圾。

void parentchildList(vector <LinkedList> &graph)//, vector <transclosure> &tc)
{
vector <int> childNode;

for(vector<LinkedList>::iterator ii = graph.begin(); ii != graph.end(); ii++)
{   

    for(vector<LinkedList>::iterator it = graph.begin(); it != graph.end(); it++)
    {
        for(list<children>::iterator li = it -> child.begin(); li != it -> child.end(); li++)
        {
            if(ii -> parent == li -> dest)
            {
                ii -> pl.push_back(it);
                it -> cl.push_back(ii);
            }
        }

    }
}


//Finding child nodes in a graph.
for(vector<LinkedList>::iterator ii = graph.begin(); ii != graph.end(); ii++)
{
    if(ii ->cl.size() != ii->child.size())          // finding child nodes and adding them to graph //linking child nodes 
    {
        bool flag = false;
        for(list<children>::iterator li = ii -> child.begin(); li != ii -> child.end(); li++)
        {
            flag = false;
            for(vector <vector <LinkedList>::iterator >::iterator itt = ii->cl.begin(); itt != ii->cl.end(); itt++)
            {   
                if((*itt)->parent == li->dest)
                    flag = true;
            }
            if(!flag)
                childNode.push_back(li->dest);
        }
    }
}


sort(childNode.begin(), childNode.end());
childNode.erase(unique(childNode.begin(), childNode.end()),childNode.end());

cout<<"Child Nodes are ";
for(vector<int>::iterator it=childNode.begin(); it!= childNode.end(); it++)
    cout<<*it<<" ";
cout<<endl;

for(vector<int>::iterator it=childNode.begin(); it!= childNode.end(); it++)
{
    LinkedList obj;
    obj.parent = *it;
    graph.push_back(obj);

    // Error happens here when I tried to insert a new obj into graph, all vaues of pl and cl becomes garbage.
}
}

1 个答案:

答案 0 :(得分:1)

存储和重用迭代器值的安全性是多少?

  

std :: vector :: insert
如果新的size()更大,则会导致重新分配   比旧容量()。
如果新的size()大于capacity(),    所有迭代器和引用均无效
否则,只有   插入点之前的迭代器和引用仍然有效。
的   过去的迭代器也会失效。

vector reference

您可以放心地假设新尺寸最终将大于初始容量。
因此您没有使用正确的数据结构。

您的设计接近adjacent lists。因此,使用std::listdoesn't invalidate iterators or references upon insertion

Btw boost has an implementation用于相邻列表..