我想做这样的事情:
for ( std::list< Cursor::Enum >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i )
{
    if ( *i == pCursor )
    {
        m_CursorStack.erase( i );
        break;
    }
}
但是擦除需要迭代器而不是反向迭代器.有没有办法将反向迭代器转换为常规迭代器或从列表中删除此元素的另一种方法?
0xC*_*ACE 165
经过一些研究和测试后,我找到了解决方案.显然根据标准[24.4.1/1],i.base()和i之间的关系是:
&*(reverse_iterator(i)) == &*(i - 1)
(来自Dobbs博士的文章):

所以你需要在获取base()时应用偏移量.因此解决方案是:
m_CursorStack.erase( --(i.base()) );
编辑
更新C++ 11.
reverse_iterator i不变:
m_CursorStack.erase( std::next(i).base() );
reverse_iterator i是高级的:
std::advance(i, 1);
m_CursorStack.erase( i.base() );
我发现这比我以前的解决方案更清楚.使用您需要的任何一种.
小智 15
请注意,m_CursorStack.erase( (++i).base())如果在for循环中使用可能会出现问题(请参阅原始问题),因为它会更改i的值.正确的表达是m_CursorStack.erase((i+1).base())
Gae*_*ola 13
有趣的是,此页面上还没有正确的解决方案。因此,以下是正确的:
对于前向迭代器,解决方案很简单:
std::list< int >::iterator i = myList.begin();
while ( i != myList.end() ) {
  if ( *i == to_delete ) {
    i = myList.erase( i );
  } else {
    ++i;
  } 
}
在反向迭代器的情况下,您需要执行相同的操作:
std::list< int >::reverse_iterator i = myList.rbegin();
while ( i != myList.rend() ) {
  if ( *i == to_delete ) {
    i = decltype(i)(myList.erase( std::next(i).base() ));
  } else {
    ++i;
  } 
}
笔记:
reverse_iterator从迭代器构造一个std::list::erasesla*_*ais 11
...或从列表中删除此元素的其他方法?
这需要-std=c++11标志(for auto):
auto it=vt.end();
while (it>vt.begin())
{
    it--;
    if (*it == pCursor) //{ delete *it;
        it = vt.erase(it); //}
}