如何解决如何使用反向迭代器调用擦除
经过更多的研究和测试,我找到了解决方案。显然根据标准 [24.4.1/1] i.base() 和 i 之间的关系是:
&*(reverse_iterator(i)) == &*(i - 1)
(来自Dobbs 博士的文章):
所以你需要在获取base()时应用一个偏移量。因此解决方案是:
m_CursorStack.erase( --(i.base()) );
更新 C++11。
reverse_iteratori
不变:
m_CursorStack.erase( std::next(i).base() );
reverse_iteratori
是高级的:
std::advance(i, 1);
m_CursorStack.erase( i.base() );
我发现这比我以前的解决方案要清楚得多。使用任何你需要的。
解决方法
我正在尝试做这样的事情:
for ( std::list< Cursor::Enum >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i )
{
if ( *i == pCursor )
{
m_CursorStack.erase( i );
break;
}
}
然而,erase 需要一个迭代器,而不是一个反向迭代器。有没有办法将反向迭代器转换为常规迭代器或从列表中删除此元素的另一种方法?