c++编程,改造Set类,重载+(并集)、(-)差集、*(交集)、<<(输出)、>>(输入)和函数调用操作符(添加一个元素)。
时间: 2024-02-05 10:03:35 浏览: 138
好的,让我们来重载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类的运算符和输出输入操作符。
阅读全文