【问题标题】:map iterator not incrementable映射迭代器不可递增
【发布时间】:2013-03-23 19:19:37
【问题描述】:

当我尝试运行我的程序时,出现“map/set iterator not incrementable”错误。我读到当您使迭代器无效时会发生这种情况,但我只是在编辑迭代器指向的对象。这是正常行为吗?我能做些什么呢? 如果我删除此行,则没有错误:

iterator->second.neighbour[direction] = &(find_iter->second);

完整代码:

void Gomoku::addUniqueMap( const map_Map& map_to_add )
{
    this->unique_maps.push_front( map_to_add );

    std::list<map_Map>::iterator map_iter = this->unique_maps.begin();
    map_Iterator iterator = map_iter->begin();

    for( ; iterator != map_iter->end(); ++iterator )
    {
        for( int i = 1, direction = 0; i > -2; --i )
        {
            for( int j = -1; j < 2; ++j )
            {
                if( iterator->second.neighbour[direction] == nullptr )
                {
                    ++direction;
                    continue;
                }
                if( i == 0 && j == 0 )
                    continue;

                COORD pos( iterator->first.x + j, iterator->first.y + i );
                wrap( pos, this->map_size );

                map_Iterator find_iter = map_iter->find( pos );
                if( find_iter != map_iter->end() )
                {
                    iterator->second.neighbour[direction] = &(find_iter->second);
                }

                ++direction;
            }
        }
    }
}

'map_Map' - std::map&lt;COORD, Pawn&gt;
'map_Iterator' - std::map&lt;COORD, Pawn&gt;::iterator
'典当' -

struct Pawn
{
    Pawn( Player player );
    Player      player;
    const Pawn* neighbour[8];
};

【问题讨论】:

  • 可以发unique_maps的类型吗?您还应该尝试删除auto,代码会更清晰(即使有点冗长)(请使用typedefs)。也许编译器为第二个auto 推导出的类型不是我们所期望的,并且您正在访问end() 迭代器...此外,如果您的地图大小为1x1,您将拥有find_iter == iterator.
  • @Synxis 我用类型替换了 autos,但它没有帮助。而且我从不访问 end() 迭代器,我总是先检查迭代器是否不是 end()。
  • 从不明确地将迭代器设置为end() 并不意味着该迭代器不能获取end() 的值...
  • @Synxis 但我检查 iterator 或 find_iter 是否设置为 end() 如果是,那么我不对这些迭代器做任何事情,所以我不应该得到运行时错误。而且我只在调试而不是在发布版本中收到此错误。
  • 仅在调试中?越来越奇怪......也许你的程序中的其他地方有内存损坏。

标签: c++ map iterator


【解决方案1】:

错误的原因是我正在访问和修改neighbour[8],所以我正在修改数组范围外的元素,可能它对迭代器做了一些事情。
在 Debug 版本中出现map/set iterator not incrementable 错误,而在 Release 版本中迭代器无法递增,导致程序无限循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2010-11-22
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多