map / set iterator not derefrencable runtime error

时间:2012-08-30 07:33:09

标签: c++ stl map iterator

我正在尝试运行此功能:

os::TMXTileset* os::TMXMap::getTilesetFromGid(int gid)
    {
        TMXTileset* tileset;
        std::map<std::string, TMXTileset>::iterator it;
        std::map<std::string, TMXTileset>::iterator comp;

        for (it=tilesetMap.begin(); it != tilesetMap.end(); it++)
        {
            comp = it;
            comp++;
            if ((gid >= it->second.getFirstGid()) && (gid < comp->second.getFirstGid()))
            {
                return &it->second;
            }
        }
        tileset = &it->second;
        return tileset;
    }

..但它给了我这个错误:

  

“map / set iterator not derefrencable”

我的第一个想法是停止解除引用它(使用它 - >第二而不是(*它).second),但这根本没有改变任何东西。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

首先复制它,然后提前复制,然后取消引用副本。这意味着只要它位于最后一个元素之前的元素上,就取消引用end()。

您可以在地图上轻松测试此内容,只有1个条目 - 它始终无法取消引用补偿。

你应该做点什么:

TMXTileset* tileset;
std::map<std::string, TMXTileset>::iterator it;
std::map<std::string, TMXTileset>::iterator comp;

for (it=tilesetMap.begin(); /*it != tilesetMap.end() can be ommited due to check for comp */; it++)
{
    comp = it;
    comp++;
    if (comp == tilesetMap.end())
    {
       break;
    }
    ...
}

答案 1 :(得分:0)

如果没有中断,你的for循环会超出地图的末尾,所以你的倒数第三行会失败。