C ++ std :: unique没有显示我对它的期望

Him*_*rma 1 c++ c++11

我试图查找向量是否包含重复项(请不要提供检查重复项的算法。)我想到了这种奇怪的行为。向量1,2,3,1上的std :: unique应该使其1,2,3,1返回迭代器为1,但擦除迭代器返回到vector.end()时,我得到了与我是原始向量。这是描述上述行为的代码片段(可在ideone上获得

    vector<int> nums2 = {1,2,3,4};  
    vector<int> nums = {1,2,3,1};
    cout << "nums1" << endl;
    vector<int> a(nums.begin(), nums.end());
    auto ip = unique(nums.begin(), nums.begin()+nums.size());
    nums.resize( std::distance(nums.begin(),ip) );
    cout << a.size() <<  " " << nums.size() << endl;

    cout << "Nums2" << endl;
    vector<int> a2(nums2.begin(), nums2.end());
    auto ip2 = unique(nums2.begin(), nums2.begin()+nums2.size());
    nums.resize( std::distance(nums2.begin(),ip2) );
    cout << a2.size() <<  " " << nums2.size();
Run Code Online (Sandbox Code Playgroud)

实际输出为

nums1
4 4
Nums2
4 4
Run Code Online (Sandbox Code Playgroud)

但这应该是

nums1
4 3
Nums2
4 4
Run Code Online (Sandbox Code Playgroud)

Fra*_*eux 6

std::unique仅删除连续的重复项。从cppreference.com上std::unique

从范围[first,last)的每个连续等效元素组中消除除第一个元素外的所有元素,并为该范围的新逻辑末尾返回一个post-the-end迭代器。

您的1不连续,因此不会被删除。这是预期的行为。一个快速的解决方案是首先到达std::sort您的范围。