【问题标题】:SIGBART ERROR vector<list<myClass> >SIGABRT 错误向量<list<myClass>>
【发布时间】:2012-11-26 19:29:27
【问题描述】:

我找不到我的程序抛出 SIGBART 错误的原因。

当这个函数被调用时,我已经缩小了范围。

bool Node::isEdgeConnected(Node vertex1, Node vertex2){

//I'm not sure if this is the right way to copy this vector <list>
vector<list<Node> > myEdgeList = *edgeList;//edgeList is a private data member of Node

vector<list<Node> >::iterator it;
cout << myEdgeList.size();


for (it = myEdgeList.begin(); it != myEdgeList.end(); it++) {
    list<Node> edge;
    edge = *it;
    Node placeNode = edge.front();

    cout <<placeNode.getNodeId()<<endl;
    list<Node>::iterator eIt;
    for (eIt = edge.begin(); eIt != edge.end(); eIt++) {
        Node placeNode1, placeNode2;
        placeNode1 = edge.front();
        placeNode2 = *eIt;

        cout << placeNode1.getNodeId() << " " << placeNode2.getNodeId()<<endl;
        if(placeNode1.getNodeId() == vertex1.getNodeId() &&
           placeNode2.getNodeId() == vertex2.getNodeId()){
            return true;
        }
    }
}
return false;

}

任何帮助将不胜感激。

【问题讨论】:

  • 断言 edgeList 不为空,类似于assert(edgeList!=NULL)
  • 另外,如果您可以在使用高调试标志 (-ggdb) 且没有优化 (-O0) 进行编译时从调试器发布回溯。
  • 断言声明的头文件是什么。

标签: c++ xcode list graph vector


【解决方案1】:

您的代码很可能在Node placeNode = edge.front(); 行中失败,您需要检查edge 是否为空

if (edge.empty()){
   continue;
}
Node placeNode = edge.front();

顺便说一句,isEdgeConnected() 函数只是检查edgeList 中的节点值,您不需要复制所有元素。如果你的edgeList 很大,复制会很贵。

比如你可以直接迭代edgeList,同样++iter比`iter++效率更高,见this

for (vector<list<Node> >::iterator it = edgeList->begin();                                       
     it != edgeList->end(); ++it) {
}

【讨论】:

  • 感谢您解决了问题。现在我必须弄清楚如何从包含列表的私有向量中访问数据。
  • 请再发一个问题,大家会很快回答的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 2013-09-21
  • 2011-06-21
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多