vector erase不彻底?

今天刷leetcode的每日一题,三数之和
在对结果进行去重的时候,使用了unique + erase函数,卡在了第123个样例上,

img


结果显示去重的不彻底,我将去重代码删除之后,发现输出的内容更多

img

所以我这个去重函数是生效了,但是不彻底?

是部分生效了,还有几个没去掉,看着像是 最后的数据没有遍历到,看看逻辑上是不是跳过了一些数据处理的???

  • 这篇博客: 使用vector容器的erase()方法时避免踩坑(leetcode 27.移除元素)中的 解决 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • nums.erase(it)之后,it就变成了一个野指针,使用 it = nums.erase(it);避免出现野指针。
    • 删除最后一个元素时在nums.end()上执行 ++ 操作,会出现错误。加入if判断解决。
     if (val == *it)
                it = nums.erase(it);
            else
                it++;
    
    
    # include "bits/stdc++.h"
    
    using namespace std;
    
    int main() {
        vector<int> nums;
        for (int i = 0; i < 3; i++) {
            nums.push_back(i);
            nums.push_back(i);
        }
        int val = 1;
        for (auto it = nums.begin(); it != nums.end();) {
            cout << *it << endl;
            if (val == *it)
                it = nums.erase(it);
            else
                it++;
        }
        cout << nums.size();
        return 0;
    }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    对于题目中提到的去除vector中的重复元素的问题,可以使用STL中的erase和unique函数来完成。

    erase函数接受一个迭代器参数,用于指定要删除的元素。对于vector,可以使用erase-remove的惯用法来删除重复元素。具体步骤如下:

    1. 首先,对vector进行排序,确保相同的元素排列在一起。
    2. 然后,使用unique函数将重复的元素移到vector的末尾,并返回指向不重复元素的尾后迭代器。
    3. 最后,使用erase函数将重复元素删除。

    下面是具体的代码示例:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    int main() {
        std::vector<int> nums = {1, 2, 2, 3, 3, 3, 4, 4, 5};
    
        std::sort(nums.begin(), nums.end()); // 排序
    
        auto it = std::unique(nums.begin(), nums.end()); // 去重,并返回不重复元素的尾后迭代器
    
        nums.erase(it, nums.end()); // 删除重复元素
    
        for (int num : nums) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    
        return 0;
    }
    

    输出结果为: 1 2 3 4 5

    这样就可以彻底去除vector中的重复元素了。 注意,这个方法只适用于排序后的vector。如果不排序,那么unique函数无法正确去除重复元素。所以在应用unique函数之前,需要确保vector已经被排序。