如何从multiset中删除最后一个元素。我尝试将反向迭代器传递给擦除函数,但这是不允许的。有什么建议吗?
答案 0 :(得分:3)
每个reverse_iterator
都有一个base()
函数,它返回“规范化”迭代器。您可以像这样使用它:
auto e = ms.rbegin();
ms.erase((++e).base());
我们必须在获取底层迭代器之前递增e
,因为基本迭代器引用了 next 的元素到reverse_iterator所指向的元素。
另一种解决方案是使用std::prev
函数:
ms.erase(std::prev(ms.end())); // since C++11
如果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;
}
它比第一个更简单,但是我留下了两个解决方案,因为我之前的第一个例子描述不正确。
答案 1 :(得分:1)
如果您只想删除一个元素,那么您可以编写
if ( !ms.empty() ) ms.erase( std::prev( ms.end() ) );
如果要删除给定键等于最后一个键的所有元素,则可以编写
if ( !ms.empty() )
{
auto p = ms.equal_range( *std::prev( ms.end() ) );
ms.erase( p.first, p.second );
}
最后如果你想删除除了一个之外的所有重复项,那么你可以写
if ( !ms.empty() )
{
auto p = ms.equal_range( *std::prev( ms.end() ) );
ms.erase( std::next( p.first ), p.second );
}
答案 2 :(得分:0)
因为multiset erase函数采用常规的迭代器。因此,如果你想要删除最后一个元素,你应该这样做。
//in C++11
multiset.erase(std::prev(multiset.end()));
//in C++98
multiset.erase(--multiset.end());
答案 3 :(得分:0)
您可以尝试以下代码:
multiset<int> mySet;
读一些整数.....
multiset<int>::reverse_iterator rit;
rit = mySet.rbegin();
mySet.erase((++rit).base());
.rbegin()函数返回一个指向集合末尾的反向迭代器,然后rit递增,因为基函数当前指向我们想要的值旁边的值(对于该部分的@soon,在他的回答中)。擦除()函数然后擦除参数中的元素。
希望这会有所帮助。 =)