C ++多字节:删除最后一个元素

时间:2013-10-19 17:29:31

标签: c++ multiset

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

4 个答案:

答案 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,在他的回答中)。擦除()函数然后擦除参数中的元素。

希望这会有所帮助。 =)