每个reverse_iterator都有一个base()返回“规范化”迭代器的函数。你可以这样使用它:
auto e = ms.rbegin();
ms.erase((++e).base());
Run Code Online (Sandbox Code Playgroud)
我们必须e在获取基础迭代器之前递增,因为基础迭代器引用了verse_iterator所指向的元素的下一个元素。
另一种解决方案是使用std::prev函数:
ms.erase(std::prev(ms.end())); // since C++11
Run Code Online (Sandbox Code Playgroud)
如果 C++11 不适合您,您可以自己实现:
// copy-pasted from cppreference
template<class BidirIt>
BidirIt prev(BidirIt it,
typename std::iterator_traits<BidirIt>::difference_type n = 1)
{
std::advance(it, -n);
return it;
}
Run Code Online (Sandbox Code Playgroud)
它比第一个更简单,但我留下了两个解决方案,因为之前我错误地描述了第一个示例。