如何用反向迭代器调用擦除?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

我想这样:

for ( std::list< Cursor::Enum >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i )
{
    if ( *i == pCursor )
    {
        m_CursorStack.erase( i );
        break;
    }
}

然而,擦除需要迭代器而不是反向迭代器。有方法将反向迭代器转换为常规迭代器吗?还是从列表中删除此元素?

提问于
用户回答回答于

经过一些更多的研究和测试,我找到了解决方案。显然根据标准[24.4.1 / 1],i.base()和i之间的关系是:

&*(reverse_iterator(i)) == &*(i - 1)

所以你需要在获得base()时应用一个偏移量。因此解决方案是:

m_CursorStack.erase( --(i.base()) );

用户回答回答于

请注意,m_CursorStack.erase( (++i).base())如果在for循环中使用的话,它会更改i的值。

正确的表达是m_CursorStack.erase((i+1).base())

扫码关注云+社区