用模板实现单例对象及其自动释放
#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;
}