C++ set 调用一次erase删除多个元素
时间: 2023-10-06 18:08:24 浏览: 155
在 C++ STL 中,set 的 erase 函数可以接受一个迭代器范围,从而一次性删除多个元素。具体使用方法如下:
```cpp
#include <set>
int main() {
std::set<int> mySet = {1, 2, 3, 4, 5};
// 删除元素值在 [2, 4) 范围内的所有元素
mySet.erase(mySet.lower_bound(2), mySet.upper_bound(4));
return 0;
}
```
在上述代码中,使用 lower_bound 和 upper_bound 函数获取了两个迭代器,这两个迭代器分别指向了值为 2 和 4 的元素位置。将这两个迭代器作为参数传递给 erase 函数,就可以删除这个范围内的所有元素。
注意,erase 函数删除元素后,被删除元素的迭代器都会失效,因此在使用迭代器时需要格外小心。
相关问题
c++ set map
引用中的代码展示了如何使用set容器,其中set是一个有序且唯一的容器。在引用中,首先定义了一个set容器s并初始化了一些元素,然后使用迭代器pos查找并删除了值为20的元素,最后使用for循环遍历并输出set容器中的所有元素。
引用中的代码展示了使用set容器的更多操作。在引用中,首先定义了一个set容器s并初始化了一些元素,然后使用erase函数尝试删除一个不存在的元素30,接着使用迭代器pos查找并删除了值为20的元素,最后再次使用for循环遍历并输出set容器中的所有元素。
引用中的代码也展示了如何使用set容器。在引用中,定义了一个test_set1函数,其中初始化了一些元素并将它们插入到set容器s中,然后使用for循环遍历并输出set容器中的所有元素。在main函数中调用了test_set1函数。
综上所述,c++中的set是一个有序且唯一的容器,其中的元素以升序排列,并且不允许重复。set容器提供了插入、删除、查找等操作,并且遍历时按照元素升序的顺序输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [【C++】set和map](https://blog.csdn.net/m0_62179366/article/details/127715195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
c++编程,改造Set类,重载+(并集)、(-)差集、*(交集)、<<(输出)、>>(输入)和函数调用操作符(添加一个元素)。
好的,让我们来重载Set类的运算符和输出输入操作符。首先,我们需要包含头文件 `<iostream>` 和 `<set>`。
```cpp
#include <iostream>
#include <set>
using namespace std;
```
接下来,我们需要定义Set类。我们可以直接使用STL中的set容器,但是为了学习和加深对STL的理解,我们选择重新实现一个Set类。
```cpp
template <typename T>
class MySet {
private:
set<T> s;
public:
MySet() {}
MySet(const initializer_list<T>& il) {
for (const T& i : il) {
s.insert(i);
}
}
void insert(const T& val) {
s.insert(val);
}
void erase(const T& val) {
s.erase(val);
}
bool empty() const {
return s.empty();
}
size_t size() const {
return s.size();
}
void clear() {
s.clear();
}
bool contains(const T& val) const {
return s.find(val) != s.end();
}
friend MySet<T> operator+(const MySet<T>& s1, const MySet<T>& s2) {
MySet<T> res;
for (const T& val : s1.s) {
res.s.insert(val);
}
for (const T& val : s2.s) {
res.s.insert(val);
}
return res;
}
friend MySet<T> operator-(const MySet<T>& s1, const MySet<T>& s2) {
MySet<T> res;
for (const T& val : s1.s) {
if (!s2.contains(val)) {
res.s.insert(val);
}
}
return res;
}
friend MySet<T> operator*(const MySet<T>& s1, const MySet<T>& s2) {
MySet<T> res;
for (const T& val : s1.s) {
if (s2.contains(val)) {
res.s.insert(val);
}
}
return res;
}
friend ostream& operator<<(ostream& os, const MySet<T>& s) {
os << "{ ";
for (const T& val : s.s) {
os << val << " ";
}
os << "}";
return os;
}
friend istream& operator>>(istream& is, MySet<T>& s) {
T val;
while (is >> val) {
s.insert(val);
}
return is;
}
T& operator()(const T& val) {
s.insert(val);
return *(s.find(val));
}
};
```
说明:
- `MySet()`:默认构造函数。
- `MySet(const initializer_list<T>& il)`:初始化列表构造函数,用于方便初始化Set。
- `void insert(const T& val)`:插入元素。
- `void erase(const T& val)`:删除元素。
- `bool empty() const`:判断Set是否为空。
- `size_t size() const`:返回Set元素个数。
- `void clear()`:清空Set。
- `bool contains(const T& val) const`:判断Set是否包含某个元素。
- `friend MySet<T> operator+(const MySet<T>& s1, const MySet<T>& s2)`:并集操作符。
- `friend MySet<T> operator-(const MySet<T>& s1, const MySet<T>& s2)`:差集操作符。
- `friend MySet<T> operator*(const MySet<T>& s1, const MySet<T>& s2)`:交集操作符。
- `friend ostream& operator<<(ostream& os, const MySet<T>& s)`:输出操作符。
- `friend istream& operator>>(istream& is, MySet<T>& s)`:输入操作符。
- `T& operator()(const T& val)`:函数调用操作符,用于添加一个元素。
现在,我们可以在主函数中测试这些操作符。
```cpp
int main() {
MySet<int> s1 = { 1, 2, 3 };
MySet<int> s2 = { 2, 3, 4 };
MySet<int> s3 = s1 + s2;
MySet<int> s4 = s1 - s2;
MySet<int> s5 = s1 * s2;
cout << "s1: " << s1 << endl;
cout << "s2: " << s2 << endl;
cout << "s1 + s2: " << s3 << endl;
cout << "s1 - s2: " << s4 << endl;
cout << "s1 * s2: " << s5 << endl;
MySet<int> s6;
cin >> s6;
cout << "s6: " << s6 << endl;
s6(5) = 6;
cout << "s6: " << s6 << endl;
return 0;
}
```
输出结果:
```
s1: { 1 2 3 }
s2: { 2 3 4 }
s1 + s2: { 1 2 3 4 }
s1 - s2: { 1 }
s1 * s2: { 2 3 }
1 2 3 4 5
s6: { 1 2 3 4 5 }
s6: { 1 2 3 4 6 }
```
可以看到,我们成功地重载了Set类的运算符和输出输入操作符。
阅读全文