伪函数
仿函数:像函数但不是函数,一般有两种形式struct或class
struct或class之所以能够进行仿函数的编写是因为他们可以进行()的运算符重载
int Min(int nNumberA, int nNumberB) 这是一个函数
{
return nNumberA < nNumberB ? nNumberA : nNumberB;
}
以下一个程序进行演示:
当仿函数是stuct形式时:
struct sMin
{
int operator()(int nNumberA, int nNumberB)
{
return nNumberA < nNumberB ? nNumberA : nNumberB;
}
}; 该种形式实现了上述函数类似的功能
当仿函数是class形式时:
class cMin
{
public:
int operator()(int nNumberA, int nNumberB)
{
return nNumberA < nNumberB ? nNumberA : nNumberB;
}
int main()
{
std::cout << Min(50, 100) << std::endl;
struct sMin objs;
std::cout << objs(50, 100) << std::endl; 结构体形式仿函数的第一种调用
std::cout << sMin()(50, 100) << std::endl; 结构体形式仿函数的第二种调用
std::cout << cMin()(50, 100) << std::endl; 类形式仿函数的调用
return 0;
}
空间适配器
空间适配器顾名思义就是取分配回收内存空间,具有可以分为两种行为,一种针对普通变量。一种针对类
下面以一个程序演示讲解
int main()
{
空间适配器对普通变量的应用:
std::allocator<int> obj; 定义一个空间适配器
int * p = obj.allocate(1); 利用空间适配器进行分配空间,()中的数字代表要分配的定义的类型的空间大小,此处分配一个int类型内存空间
obj.construct(p, 12138); 利用空间适配器构造一个变量并赋值
std::cout << *p << std::endl; 打印12138,可以正常使用
*p = 100; 也可以解引用修改值
std::cout << *p << std::endl; 同样也可以正常打印
int *nAddr = obj.address(*p); 利用空间适配器设置两个内存指向相同类型的对象
std::cout << nAddr << "\t" << p << std::endl; 两个指针指向同一个位置
int Temp = 500;
int *nAddr = obj.address(Temp); 这种形式类似于上述方法,两个变量
内存同样指向同一内存地址
std::cout << nAddr << "\t" << *nAddr << std::endl; 打印该变量地址及数据
以上两种空间适配器的应用类似于申请引用
std::cout << obj.max_size() << std::endl; 可以获取空间支配器最大的大小
obj.deallocate(p, 1); p伪分配内存的对象,1为要回收内存的大小,用于回收该空间适配器分配
的对象内存大小
空间适配器对类的应用:
std::allocator<MyClass> objc; 申请了一个类的类型的空间适配器
MyClass * tObj = objc.allocate(1); 创建一个类对象并利用空间适配器申请内存
objc.construct(tObj, 12138); 利用空间适配器进行构造类对象
std::cout << tObj->nNumber << std::endl;
objc.destroy(tObj); 销毁类对象
objc.deallocate(tObj, 1); 回收内存
system("pause");
return 0;
}