我正在使用图形构建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.
}
}
答案 0 :(得分:1)
存储和重用迭代器值的安全性是多少?
std :: vector :: insert
如果新的size()更大,则会导致重新分配 比旧容量()。
如果新的size()大于capacity(), 所有迭代器和引用均无效 。
否则,只有 插入点之前的迭代器和引用仍然有效。
的 过去的迭代器也会失效。
您可以放心地假设新尺寸最终将大于初始容量。
因此您没有使用正确的数据结构。
您的设计接近adjacent lists。因此,使用std::list
,doesn't invalidate iterators or references upon insertion。
Btw boost has an implementation用于相邻列表..