我正在尝试这样做:

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


当前回答

反向迭代器很难使用。使用通用迭代器。'r'从最后一个元素开始。当发现需要抹去的东西时。删除它并返回下一个迭代器。例如当删除第3个元素时,它将指向当前的第4个元素。新的第三个。所以它应该减少1,向左移动

void remchar(string& s,char c)
{      
    auto r = s.end() - 1;
    while (r >= s.begin() && *r == c)
    {
        r = s.erase(r);
        r -= 1;
    }
}

其他回答

... 或者从列表中删除该元素的另一种方法?

这需要-std=c++11标志(用于auto):

auto it=vt.end();
while (it>vt.begin())
{
    it--;
    if (*it == pCursor) //{ delete *it;
        it = vt.erase(it); //}
}

为了补充其他人的答案,因为我在搜索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\'

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

请注意m_CursorStack。如果在for循环中使用erase((++i).base())可能是一个问题(见原始问题),因为它改变了i的值。正确的表达式是m_CursorStack.erase((i+1).base())

m_map.erase((++r_iter).base()在循环中不起作用的原因是erase()会使++r_iter无效!!我们只需要使用erase()的返回值。

如果m_CursorStack是一个向量,你可以通过取index来擦除:

m_CursorStack.erase(m_CursorStack.begin() + m_CursorStack.size() + int(m_CursorStack.rbegin() - i) - 1);