映射/设置迭代器未解除可绑定运行时错误

map/set iterator not derefrencable runtime error

本文关键字:绑定 运行时错误 设置 迭代器 映射      更新时间:2023-10-16

我正在尝试运行这个函数:

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;
    }

但它给了我一个错误:

"映射/设置迭代器不可撤消"

我的第一个想法是停止取消引用它(使用it->second而不是(*it).second),但这并没有改变任何事情。

有什么想法吗?

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

您可以在只有1个条目的映射上轻松地测试这一点——它应该总是无法取消引用comp。

你应该做一些类似的事情:

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;
    }
    ...
}

如果不中断,for循环将运行到映射的末尾之外,因此最后第三行将失败。