72 lines
1.5 KiB
C++
72 lines
1.5 KiB
C++
#ifndef EVIL_HPP
|
|
#define EVIL_HPP
|
|
|
|
#include <cstring>
|
|
#include <iostream>
|
|
using namespace std;
|
|
|
|
class Evil {
|
|
private:
|
|
int st, ed, val;
|
|
int *data = nullptr;
|
|
|
|
public:
|
|
// 构造函数
|
|
Evil(int __st = 0, int __ed = 0, int __val = 0) {
|
|
st = __st;
|
|
ed = __ed;
|
|
val = __val;
|
|
data = new int[ed - st + 1]();
|
|
}
|
|
Evil(const Evil &src) {
|
|
st = src.st;
|
|
ed = src.ed;
|
|
val = src.val;
|
|
data = new int[ed - st + 1]();
|
|
std::memmove(data, src.data, sizeof(int) * (ed - st + 1));
|
|
}
|
|
// 下标运算符重载
|
|
int &operator[](int idx) {
|
|
if (idx < st || idx > ed) return *data;
|
|
return *(data + idx - st);
|
|
}
|
|
// 赋值运算符重载
|
|
Evil &operator=(const Evil &src) {
|
|
delete[] data;
|
|
st = src.st;
|
|
ed = src.ed;
|
|
val = src.val;
|
|
data = new int[ed - st + 1]();
|
|
std::memmove(data, src.data, sizeof(int) * (ed - st + 1));
|
|
return *this;
|
|
}
|
|
// 前缀++重载
|
|
Evil &operator++() {
|
|
val++;
|
|
return *this;
|
|
}
|
|
// 后缀++重载
|
|
Evil operator++(int) {
|
|
Evil ret = *this;
|
|
val++;
|
|
return ret;
|
|
}
|
|
// 输出重载
|
|
friend std::ostream &operator<<(std::ostream &stream, const Evil &dat);
|
|
// 析构函数
|
|
~Evil() { delete[] data; }
|
|
|
|
void Print() {
|
|
cout << val << " ";
|
|
for (int i = 0; i < ed - st + 1; ++i) cout << data[i] << " ";
|
|
cout << endl;
|
|
}
|
|
};
|
|
|
|
std::ostream &operator<<(std::ostream &stream, const Evil &dat) {
|
|
stream << dat.val;
|
|
for (int i = 0; i <= dat.ed - dat.st; i++) stream << ' ' << *(dat.data + i);
|
|
stream << std::endl;
|
|
return stream;
|
|
}
|
|
#endif // EVIL_HPP
|