繁体   English   中英

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

[英]Safe to store and reuse vector iterator values?

我正在使用图形构建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.
}
}

存储和重用迭代器值有多少安全?

的std ::矢量::插入
如果新的size()大于旧的Capacity(),则导致重新分配。
如果新的size()大于Capacity(),则所有迭代器和引用均无效
否则,只有插入点之前的迭代器和引用保持有效。
过去的迭代器也无效。

向量参考

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

您的设计靠近相邻列表 因此,请使用std::list ,它不会在插入时使迭代器或引用无效

Btw boost对相邻列表有一个实现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM