编程技巧

#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;
}

posted @ 2025-08-22 11:13  雾岛春颂  阅读(14)  评论(0)    收藏  举报