您的位置:

C++中的set erase操作详解及使用技巧

一、erase操作的基本用法

std::set是C++标准库中的一个容器,它是一个有序集合,其中每个元素都唯一。当我们在set中插入元素时,会自动按照一定的规则将元素插入到正确的位置,其中插入了重复的元素会被忽略。erase操作是set中用于删除元素的方法,其基本用法如下:

std::set<int> my_set;
// 添加一些元素
my_set.insert(1);
my_set.insert(2);
my_set.insert(3);
// 删除元素
my_set.erase(2);

上面的代码中,我们首先创建了一个空的set,然后添加了3个元素1、2、3。最后通过erase操作删除2这个元素。需要注意的是,当我们调用erase方法时,它会返回删除的元素的数量,因为在一些情况下,set中并不一定存在要删除的元素。

二、删除set中重复的元素

std::set是一个不允许有重复元素的集合,如果我们需要去除set中的重复元素,可以使用erase方法和unique算法来实现。例如,我们有一个包含重复元素的vector:

std::vector<int> vec {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
std::set<int> s(vec.begin(), vec.end());

可以使用以下代码删除重复元素:

vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

unique方法可以将序列中的相邻重复元素删除,返回一个指向新序列结尾的迭代器,然后我们将这个迭代器作为参数传递给erase方法即可。需要注意的是,unique方法只能用于有序容器。

三、使用自定义类型删除set元素

std::set默认使用元素类型的比较运算符来比较元素大小,如果我们使用自定义类型,需要重载操作符。例如,我们有一个自定义类型Person:

struct Person {
    std::string name;
    int age;
    bool operator<(const Person& other) const {
        return name < other.name;
    }
};

以上代码中,我们定义了一个Person结构体,包含姓名和年龄两个成员变量。重载了小于操作符,使得set能够根据姓名按照字典序排序。现在我们创建一个Person对象的set:

std::set<Person> s;
s.insert(Person{"Alice", 20});
s.insert(Person{"Bob", 21});
s.insert(Person{"Charlie", 22});

现在我们可以使用erase方法删除set中的Person对象了:

s.erase(Person{"Bob", 21});

需要注意的是,我们必须重载小于操作符,才能够使用默认的set的比较运算符。同时,为了保证set的正确性,我们需要满足严格弱序关系,即如果a < b,则b不能小于a。

四、使用erase方法删除set中满足特定条件的元素

除了使用erase方法删除特定的元素,我们还可以使用std::set的一些方法来删除满足特定条件的元素。例如,我们有以下一个set:

std::set<int> s {1, 2, 3, 4, 5};

我们可以使用std::set的find和lower_bound方法来查找set中满足特定条件的元素。例如,我们想要删除set中所有大于等于3的元素:

auto iter = s.lower_bound(3);
s.erase(iter, s.end());

上面的代码中,lower_bound方法可以查找第一个大于等于给定值的元素的迭代器。然后我们将这个迭代器作为参数传递给erase方法删除这些元素。

五、小结

在C++中,std::set是一个有用的容器,可以自动按照一定规则排序,并且保证元素唯一。erase方法是set中用于删除元素的方法,可以删除指定的元素和满足特定条件的元素。我们还可以使用unique算法来删除set中的重复元素。如果我们使用自定义类型,需要重载小于操作符,并满足严格弱序关系。