我正在尝试这样做:
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\'
它使用算法、迭代器和字符串头。
如果你不需要在运行过程中删除所有内容,那么要解决这个问题,你可以使用erase-remove习语:
m_CursorStack.erase(std::remove(m_CursorStack.begin(), m_CursorStack.end(), pCursor), m_CursorStack.end());
remove将容器中与pCursor匹配的所有项交换到最后,并返回指向第一个匹配项的迭代器。然后,使用范围的擦除将从第一个匹配擦除,直到结束。不匹配元素的顺序保持不变。
如果您正在使用std::vector,这可能会更快,其中在内容中间擦除可能涉及大量复制或移动。
当然,上面解释使用reverse_iterator::base()的答案是有趣的,值得了解,为了解决所述的确切问题,我认为std::remove更合适。