我正在尝试这样做:
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需要一个迭代器,而不是反向迭代器。有没有一种方法可以将反向迭代器转换为常规迭代器,或者另一种方法将该元素从列表中删除?
发布于 2009-12-02 10:09:26
经过进一步的研究和测试,我找到了解决方案。显然,根据标准24.4.1/1,i.base()和I之间的关系是:
&*(reverse_iterator(i)) == &*(i - 1)(从Dr. Dobbs article):

因此,在获取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() );我发现这一点比我之前的解决方案要清晰得多。使用您需要的任何一个。
发布于 2010-09-28 08:33:21
请注意,如果在for循环中使用m_CursorStack.erase( (++i).base())可能会有问题(参见原始问题),因为它会更改i的值。正确的表达式是m_CursorStack.erase((i+1).base())
发布于 2018-05-11 05:57:59
有趣的是,这个页面上还没有正确的解决方案。因此,下面是正确的一条:
在前向迭代器的情况下,解决方案是直接的:
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::erase的返回值
https://stackoverflow.com/questions/1830158
复制相似问题