#include<iostream>
#include<vector>
#include<set>
#include<cstdint>
using namespace std;
// 封装泛型函数使用c++的IO流对集合进行输出
template<class T>
ostream& operator<<(ostream & os, const vector<T> & v) {
for(int i = 0; i < int(v.size()); ++i) os << v[i] << " ";
return os;
}
template<class T>
ostream& operator<<(ostream & os, const set<T> & s) {
for(auto x : s) os << x << " ";
return os;
}
// 内存池
// 用于动态分配内存对象
template<class T>
struct Pool {
vector<T*> buf;
T* createNew() {
buf.push_back(new T()); //动态分配返回的是他的地址
return buf.back();
}
void dispose() {
for(int i = 0; i < buf.size(); ++i) delete buf[i];
buf.clear();
}
};
struct Node {
string name;
int grade;
Node() { //这里无参数构造函数会覆盖那个默认的无参构造函数
name = "xiaoming";
grade = 100;
}
};
// 位运算操作封装
// 在使用位操作对集和或进行状态压缩时候,常用的操作就是取得一个整数中某一位或者连续几位对应的int值
// 这里封装一个位运算的操作类
// 这里的下标是最右边为0开始的!
template<class TI> // TI一般是int/long long
struct BitOp {
// 反转pos开始,长度len的区域
inline TI flip(TI op, size_t pos, size_t len = 1) {
return op^(((1 << len) - 1) << pos); // 例如: 10101 从第二位反转长度是2 : 10101 ^ 01100 = 11001 原始值不变
}
// 将二进制数中指定位置的位区域设置为给定的整数值
inline TI & set(TI & op, size_t pos, int v, size_t len = 1) {
int o = ((1 << len) - 1);
return op = (op&(~(o << pos))) | ((v&o) << pos);
}
// 取得pos开始,长度len的区域的值
inline int get(TI op, size_t pos, size_t len = 1) {
return (op >> pos) & ((1 << len) - 1);
}
// 输出整数的二进制表示
ostream & outBits(ostream & os, TI i) {
if(i) outBits(os, (i >> 1)) << (i & 1);
return os;
}
};
int main() {
vector<int> v = {1,2,3};
set<string> s = {"czm","123","abc"};
cout << v << '\n';
cout << s << '\n';
// 内存池的使用
Pool<Node> P;
Node * node1 = P.createNew();
cout << node1->name << " " << node1->grade << '\n';
P.dispose(); // 销毁
// 位运算类使用
BitOp<int> Bit;
int Op = 21; //(10101)
int ans1 = Bit.flip(Op, 2, 2); // (11001)
int ans2 = Bit.get(Op, 2, 2); // (01 = 1)
Bit.set(Op, 1, 0, 3); // (10001)
cout << ans1 << '\n' << ans2 << '\n' << Op << '\n';
Bit.outBits(cout, Op);
return 0;
}