我正在尝试这样做:

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需要一个迭代器,而不是反向迭代器。有没有一种方法可以将反向迭代器转换为常规迭代器,或者另一种方法可以从列表中删除该元素?


当前回答

为了补充其他人的答案,因为我在搜索std::string时偶然发现了这个问题,没有太多成功,这里有一个使用std::string, std::string::erase和std::reverse_iterator的响应

我的问题是从一个完整的文件名字符串中删除一个图像文件名。它最初是用std::string::find_last_of解决的,但我研究了std::reverse_iterator的替代方法。

std::string haystack("\\\\UNC\\complete\\file\\path.exe");
auto&& it = std::find_if( std::rbegin(haystack), std::rend(haystack), []( char ch){ return ch == '\\'; } );
auto&& it2 = std::string::iterator( std::begin( haystack ) + std::distance(it, std::rend(haystack)) );
haystack.erase(it2, std::end(haystack));
std::cout << haystack;  ////// prints: '\\UNC\complete\file\'

它使用算法、迭代器和字符串头。

其他回答

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

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

(摘自多布斯博士的文章):

因此,在获取base()时需要应用偏移量。因此解决方案是:

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

EDIT

针对c++ 11进行更新。

Reverse_iterator I不变:

m_CursorStack.erase( std::next(i).base() );

Reverse_iterator I是高级的:

std::advance(i, 1);
m_CursorStack.erase( i.base() );

我发现这比之前的解清楚多了。你需要什么就用什么。

typedef std::map<size_t, some_class*> TMap;
TMap Map;
.......

for( TMap::const_reverse_iterator It = Map.rbegin(), end = Map.rend(); It != end; It++ )
{
    TMap::const_iterator Obsolete = It.base();   // conversion into const_iterator
    It++;
    Map.erase( Obsolete );
    It--;
}

虽然在这里使用reverse_iterator的base()方法并对结果进行递减,但值得注意的是,reverse_iterators的状态与常规迭代器不同。一般来说,您应该更喜欢常规迭代器而不是reverse_iterators(以及const_iterators和const_reverse_iterators),原因正是如此。有关原因,请参阅多布斯医生杂志进行深入讨论。

为了补充其他人的答案,因为我在搜索std::string时偶然发现了这个问题,没有太多成功,这里有一个使用std::string, std::string::erase和std::reverse_iterator的响应

我的问题是从一个完整的文件名字符串中删除一个图像文件名。它最初是用std::string::find_last_of解决的,但我研究了std::reverse_iterator的替代方法。

std::string haystack("\\\\UNC\\complete\\file\\path.exe");
auto&& it = std::find_if( std::rbegin(haystack), std::rend(haystack), []( char ch){ return ch == '\\'; } );
auto&& it2 = std::string::iterator( std::begin( haystack ) + std::distance(it, std::rend(haystack)) );
haystack.erase(it2, std::end(haystack));
std::cout << haystack;  ////// prints: '\\UNC\complete\file\'

它使用算法、迭代器和字符串头。

只是想澄清一些事情:在上面的一些评论和回答中,erase的便携版本被提到为(++i).base()。然而,除非我遗漏了一些东西,否则正确的语句是(++ri).base(),这意味着你“增加”reverse_iterator(而不是迭代器)。

昨天我遇到了类似的事情,这篇文章很有帮助。谢谢每一个人。