我是否保证std :: unique将保留第一个元素?

时间:2014-06-05 05:39:58

标签: c++ c++11 unique standards stl-algorithm

根据对的第一个元素的比较,考虑排序的std::vector<std::pair<int, int>>

现在假设我申请:

std::unique(std::begin(v), 
            std::end(v), 
            [](const std::pair<int, int>& x, const std::pair<int, int>& y)
            {return x.first == y.first;});

我是否保证std::unique将保留每个相等范围的第一个元素?

2 个答案:

答案 0 :(得分:9)

是。

  

从[first,last]范围中的每个连续的等效元素组中消除除第一个元素之外的所有元素,并返回该范围的新逻辑结尾的过去的迭代器。

From here.

您提供的BinaryPredicate意味着将删除y等于前一个元素x的任何元素。

答案 1 :(得分:2)

是。 The C++14 draft standard在第25.3.9节[alg.Unique](强调我的)中说:

  

效果:对于非空范围,从第一个+ 1,最后一个范围内的迭代器i引用的每个连续等效元素组中消除除第一个元素之外的所有元素条件成立:*(i - 1)== i或pred((i - 1),* i)!= false。

标准的引用在这里很重要,因为在这一点上通常的互联网资源给出了两个不同的答案:en.cppreference.com不给出保证,但是cplusplus.com(由Ben引用{{3有保证。)