【问题标题】:list iterators not compatible unordered_map列出不兼容的迭代器 unordered_map
【发布时间】:2015-12-17 21:53:20
【问题描述】:

我有一个相当大的项目,它实现了 Dijkstra 的算法来模拟网络发送数据包,我遇到了一个我从未见过的问题;

我已经设法将问题缩小到这个范围:

//Member function of vertex
unordered_map<Vertex *, int> getEdges()
{
    return _edges; //same data type as return type
}
//Call to member function 
Vertex *t = //Arbitrary vertex
unordered_map<Vertex*, int> edges = t->getEdges();

由于某种原因,在调用此函数时,我收到错误“列表迭代器不兼容”。有谁明白为什么会这样?

编辑: 暂时删除

编辑2: 结果我从 getEdges() 得到了一个空的 unordered_map,因为我做了最后一分钟的更改。显然这会导致“列表迭代器不兼容”。

为了其他人从我的错误中吸取教训,我稍后会将代码上传到更永久的位置。

【问题讨论】:

  • 这是一个运行时错误,对吧?请包含一个实际演示问题的最小可编译示例。谢谢。
  • 是的,这是运行时错误,我可以压缩文件/病毒扫描并将其链接到您。
  • @TheAnonyMoose1234512:不,在这里发一个Minimal, Complete, and Verifiable Example 我应该能够复制发布少量代码,运行它,得到完全相同的运行时错误

标签: c++ c++11 dijkstra


【解决方案1】:

结果我从 getEdges() 得到了一个空的 unordered_map,因为我在最后一分钟做了更改。显然这会导致“列表迭代器不兼容”。

【讨论】:

  • 我根据您的问题尝试的最小示例以及我错误地假设编译器检测到错误(当我想到它时显然是错误的),即使是空的也没有出现任何运行时错误地图通过了。 coliru.stacked-crooked.com/a/96a39ab6c93cbc07 。所以不仅仅是地图是空的;一定有其他事情发生。这就是为什么最小可编译示例对您和任何帮助的人都很有用。
【解决方案2】:

以下代码适用于我在 NetBeans 中使用 C++ 11。请记住,我使用的值是任意的,当然我已经硬编码了每个 Vertex 以返回任意新边(我假设你是这样的) d改变)..

using namespace std;
struct Vertex{

    //Member function of vertex
    unordered_map<Vertex*, int> getEdges()
    {
        unordered_map<Vertex*, int> v;

        std::pair<Vertex*, int> first (new Vertex(), 0);
        std::pair<Vertex*, int> second (new Vertex(), 1);
        std::pair<Vertex*, int> third (new Vertex(), 2);
        std::pair<Vertex*, int> fourth (new Vertex(), 3);
        v.insert(first);
        v.insert(second);
        v.insert(third);
        v.insert(fourth);
        return v; //same data type as return type
    }
};


int main(int argc, char** argv) 
{        
    Vertex t;

    //Call to member function 
    unordered_map<Vertex*, int> edges = t.getEdges();

    cout << "edges " << edges.size();

    // clean up
    edges.clear();


    return 0;
}

【讨论】:

  • 您的清理工作至少应该删除t。 (因为getEdge 实现是一个占位符,这些没有备注)。
  • 您放错了删除位置,就像您现在删除 nullptr... 更简单地更改为 Vertex t; 顺便说一句,避免手动内存管理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多