C++学习笔记14

用模板实现单例对象及其自动释放

#include <iostream>
using namespace std;

template<class T>
class Singleton
{
    class AutoRelease
    {
    public:
        AutoRelease() {cout << "AutoRelease()" << endl;}
        ~AutoRelease(){
            if(_pinstance)
                delete _pinstance;
            cout << "~AutoRelease()" << endl;
        }
    };
public:
    template<class...Args>
    static T* getinstance(Args...args)
    {
        (void)_auto;
        if(_pinstance == nullptr)
            _pinstance = new T(args...);
        return _pinstance;
    }
private:
    Singleton(){cout << "Singleton()" << endl;}
    ~Singleton(){cout << "~Singleton()" << endl;}
private:
    static T* _pinstance;
    static AutoRelease _auto;
};

template<class T>
T *Singleton<T>::_pinstance = nullptr;

template<class T>
class Singleton<T>::AutoRelease Singleton<T>::_auto;

class Point
{
private:
    int _ix;
    int _iy;
public:
    Point(int ix, int iy)
    :_ix(ix)
    ,_iy(iy)
    {
        cout << "Point(int, int)" << endl;
    }
    ~Point(){
        cout << "~Point()" << endl;
    }
};

int main(int argc, char* argv[])
{
    Point *p = Singleton<Point>::getinstance(1,2);
    Point *p1 = Singleton<Point>::getinstance(1,2);
    cout << p << endl
         << p1 << endl;
    return 0;
}

泛型算法

for_each();
find();
lower_bound();
remove():不会直接删除元素,仅是将满足条件的元素赋给不满足条件元素的位置
replace_if();
lambda表达式:匿名函数,格式为[] (形参列表) {函数体};
ref():引用包装器,传递是引用,如果被引用的变量发生改变,传递的参数会随之改变
注意:在遍历元素的过程中,添加元素会导致底层数据存放的位置发生改变,从而导致迭代器失效,所以一般情况下不要在遍历元素的同时删除元素。

bind

可以使用bind函数(包括成员函数)事先绑定参数,其返回值是函数对象,如

f = bind(&class_name::func_name, class_example, placeholders::_1, placeholders::_2);//占位符本身所在位置代表形参对应位置,占位符的数字代表实参位置

对于成员函数的绑定,this指针所在位置既可传递地址,也可传递对象本身,如果传递的是地址,则必须保证函数被调用时,对象的生命周期仍存在。

mem_fn

全称为member_function,用于适配类的成员函数
下为一个简单的示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

class Number
{
public:
    Number(int data)
        : _data(data) {}
    void display()
    {
        cout << _data << " ";
    }
    bool isEven() const
    {
        return _data % 2 == 0;
    }
    bool isPrime() const
    {
        if (_data == 0 || _data == 1)
            return false;
        for (int i = 2; i <= _data / 2; ++i)
            if (_data % i == 0)
                return false;
        return true;
    }

private:
    int _data;
};

int main(int argc, char *argv[])
{
    vector<Number>ivec;
    for(int i = 1; i != 100; ++i)
        ivec.emplace_back(i);
    // for_each(ivec.begin(), ivec.end(), mem_fn(&Number::display));
    // cout << endl;
    // auto it = remove_if(ivec.begin(), ivec.end(), mem_fn(&Number::isEven));
    // ivec.erase(it, ivec.end());
    // for_each(ivec.begin(), ivec.end(), mem_fn(&Number::display));
    // cout << endl;
    auto it = remove_if(ivec.begin(), ivec.end(), mem_fn(&Number::isPrime));
    ivec.erase(it, ivec.end());
    //for_each(it, ivec.end(), mem_fn(&Number::display));
    for_each(ivec.begin(), ivec.end(), mem_fn(&Number::display));
    cout << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值