map / set iterator不是dereferencable。 Multimap容器isse

时间:2015-05-23 21:03:11

标签: c++ graph multimap

我发现此错误消息map/set iterator not dereferencable尝试按multimap中的键获取值时。在此代码中,我尝试显示由邻接列表(vector<Vertex*> vertexList)表示的非定向图

void NonOrGraph::show() {

    cout << endl;
    multimap<int, int> used;
    for (int i = 0; i < vertexList.size(); i++) {
        if (vertexList[i]->adjMap.empty()) {
            cout << vertexList[i]->index << " isolated";
        } else {
            for(map<Vertex*, int>::iterator it = vertexList[i]->adjMap.begin();
                                                 it != vertexList[i]->adjMap.end();
                                                 it++)
            {

                int from = vertexList[i]->index;
                int to   = it->first->index;
                int weight = it->second;

                used.insert(pair<int, int>(from, to)); 
                if (used.find(to)->second != from) {
                    cout << from << " <--(" << weight << ")--> " << to << endl;
                }
            }
        }
    }

    cout << "\n\n";

}

1 个答案:

答案 0 :(得分:0)

问题可能在这里:

if (used.find(to)->second != from) {

如果to不在usedused.find()将返回used.end(),然后您将其取消引用。取消引用end()迭代器是未定义的行为,在这种情况下通过给出运行时错误来表示。

您必须首先检查end()的迭代器:

std::multimap<int, int>::iterator multi_it = used.find(to);
if (multi_it != used.end() && multi_it->second != from) {
//                        ^^^^^^^^^^^^^^^^^^^^
//                        now, it's safe to dereference