我是使用c ++编程的新手,所以如果我的源代码不十分出色,请不要生我的气。
为了我的研究,我必须编写一个程序来处理图中的节点和边。
std::lists
我的源代码中有2个。第一个用于存储常规Nodes
,第二个用于存储称为的节点的种类类ArticleNodes
。通常,所有元素都是指向创建的对象的指针。
为了弄清楚一个对象在另一个列表中是否相同,我保存了内存地址并将其与第二个列表中的元素进行比较。如果存在匹配项,则将删除第二个元素。
现在,我想删除两个列表中的一个元素:
void Graph::deleteNode(unsigned int nodeNumber)
{
list<Node*>::iterator it = m_nodes.begin();
ArticleNode* pCurrentArticleNode;
for(unsigned int i=1; i<nodeNumber; i++) { it++; }
Node* pCurrentNode = (*it);
for (list<ArticleNode*>::iterator itArticle = m_articlenode.begin(); itArticle != m_articlenode.end(); itArticle++)
{
pCurrentArticleNode = (*itArticle);
if(pCurrentNode==pCurrentArticleNode) { m_articlenode.remove(pCurrentArticleNode); }
}
m_nodes.remove(pCurrentNode);
delete pCurrentNode;
delete pCurrentArticleNode;
}
我可以编译它,但是当我调用该函数时,我的程序仅以return 1退出。实际上,我发现if子句中的remove-command是问题所在。为什么这样不起作用?
您应该使用算法,而不是手动完成所有操作:
void Graph::deleteNode(unsigned int nodeNumber)
{
assert (nodeNumber < m_nodes.size());
auto it = std::next( m_nodes.begin(), nodeNumber - 1 );
auto itArticle = std::find( m_articlenode.begin(), m_articlenode.end(), *it );
if( itArticle != m_articlenode.end() )
m_articlenode.erase( itArticle );
delete *it;
m_nodes.erase(it);
}
顺便说一句,您的代码两次删除同一对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句