类型“set<int>”不提供下标运算符

Har*_*nar 1 c++ set

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        //use set. As in set, element appears only once.

        set<int> s;

        for(int i=0; i<nums.size(); i++) {
            s.insert(nums[i]);
        }

        nums.clear();

        for(int i=0; i<s.size(); i++) {

            nums.push_back(s[i]);
        }

        return s.size();
    }
};
Run Code Online (Sandbox Code Playgroud)

https://leetcode.com/problems/remove-duplicates-from-sorted-array/solutions/

正如你所看到的,上面是我针对 leetcode 问题的解决方案代码(我还在下面给出了它的链接)。我似乎没有在我的代码中看到问题,但它给了我错误。请帮忙。

Ted*_*gmo 7

编译器是正确的。Astd::set没有下标运算符。一般来说,带有 an 的容器operator[]使用它来提供元素的恒定时间查找。在数组 中int arr[10],您可以使用arr[9]并访问第 10 个元素,其速度与访问第一个元素 一样快arr[0]。这对于std::unordered_map和 来说是类似的std::map。您有一个,您可以使用它在大约相同的时间内查找,而与您查找哪个元素无关。

std::set然而不是这样的容器。10访问a 中的元素std::set需要一直迭代到第 10 个元素。幸运的是,您不需要下标运算符。只需使用 中的迭代器创建集合vector,然后将结果分配回向量:

class Solution {
public:
    std::size_t removeDuplicates(std::vector<int>& nums) {

        // create the set from the values in the vector:
        std::set<int> s(nums.begin(), nums.end());

        // assign the values in the set to the vector:
        nums.assign(s.begin(), s.end());

        return s.size();
    }
};
Run Code Online (Sandbox Code Playgroud)

然而,阅读实际任务会发现一些有趣的事情:

nums 给定一个按非降序排序的整数数组,就地删除重复项,以便每个唯一元素仅出现一次。元素的相对顺序应保持相同。

它已经排序的事实使得人们很容易使用std::uniquevector::erase就地执行此操作,而不是使用std::set

#include <algorithm>

class Solution {
public:
    std::size_t removeDuplicates(std::vector<int>& nums) {
        auto new_end_it = std::unique(nums.begin(), nums.end());
        nums.erase(new_end_it, nums.end());
        return nums.size();
    }
};
Run Code Online (Sandbox Code Playgroud)