Files
2024-03-17 22:30:49 +08:00

108 lines
2.0 KiB
C++

// 实现 Set 模板类,并重载 +、<< 和 >> 操作符
#include <bits/stdc++.h>
using namespace std;
template <typename T = int>
class Set {
private:
vector<T> a;
public:
int search(const T &) const;
int operator()(const T &);
int del(const T &);
Set<T> operator*(const Set<T> &) const;
Set<T> operator+(const Set<T> &) const;
Set<T> operator-(const Set<T> &) const;
template <typename S>
friend ostream &operator<<(ostream &output, const Set<S> &s);
template <typename S>
friend istream &operator>>(istream &input, Set<S> &s);
};
template <typename T>
int Set<T>::search(const T &x) const {
for (int i = 0; i < a.size(); i++)
if (a[i] == x)
return i;
return -1;
}
template <typename T>
int Set<T>::operator()(const T &x) {
if (search(x) != -1)
return 0;
a.push_back(x);
return 1;
}
template <typename T>
int Set<T>::del(const T &x) {
int i = search(x);
if (i == -1)
return 0;
a.erase(a.begin() + i);
return 1;
}
template <typename T>
Set<T> Set<T>::operator*(const Set<T> &s) const {
Set<T> t;
for (int i = 0; i < a.size(); i++)
if (s.search(a[i]) != -1)
t(a[i]);
return t;
}
template <typename T>
Set<T> Set<T>::operator+(const Set<T> &s) const {
Set t = *this;
for (int i = 0; i < s.a.size(); i++)
t(s.a[i]);
return t;
}
template <typename T>
Set<T> Set<T>::operator-(const Set<T> &s) const {
Set t;
for (int i = 0; i < a.size(); i++)
if (s.search(a[i]) == -1)
t(a[i]);
return t;
}
template <typename T>
ostream &operator<<(ostream &output, const Set<T> &s) {
for (int i = 0; i < s.a.size(); i++)
output << s.a[i] << ' ';
return output;
}
template <typename T>
istream &operator>>(istream &input, Set<T> &s) {
s.a.clear();
int x;
while (input >> x)
s(x);
return input;
}
int main() {
Set<int> s1, s2;
cout << "s1: ";
cin >> s1;
s2(9);
s2(10);
s2(11);
s2(12);
s2(13);
s2(14);
s2(15);
cout << "s2: " << s2 << endl;
cout << "s1 * s2: " << s1 * s2 << endl;
cout << "s1 + s2: " << s1 + s2 << endl;
cout << "s1 - s2: " << s1 - s2 << endl;
return 0;
}