一、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中的重複元素。如果我們使用自定義類型,需要重載小於操作符,並滿足嚴格弱序關係。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297151.html