C++ 多重集:删除最后一个元素

ish*_*243 2 c++ multiset

如何从多重集中删除最后一个元素。我尝试将反向迭代器传递给擦除函数,但这是不允许的。有什么建议么?

awe*_*oon 6

每个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)

它比第一个更简单,但我留下了两个解决方案,因为之前我错误地描述了第一个示例。