c++ STL 005 分配器/泛型编程/模版基础

分配器 allocator

用于给stl容器进行数据空间的分配,每一个容器都有默认的分配器,以保证容器能够取得指定的内存。

容器在构造时,会将默认的分配器作为默认参数对容器进行构造。

  1. *operator new 和malloc
    *operator new c++范围,可以重载,使用::operator delete进行释放。
    malloc c函数,不可重载,使用free进行释放内存。
  2. 不同的编译器设计的分配器可能会有不同,一般使用的是以上的其中一种。
  3. 所有容器,默认第二个参数为allocator分配器。这个默认的分配器与容器是相匹配的。
  4. 使用的时候一般使用默认的分配器就可以,不需要自己单独指定,如果要指定使用哪个分配器也是可以的,将在容器构造器的相应参数位置传入即可。

OOP和GP

OOP 面向对象编程:

	将数据data和方法methods都放置在class中

	class{
		data
		method
	}

GP 泛型编程

	将数据data和methods 分开,data放置在容器中,methos使用算法来进行,
	 两者通过迭代器iterator来进行沟通,即算法methods通过iterator来对容器进行操作。

操作符重载
  1. 不可以重载的操作符:

    ::
    .
    .*
    ?:

  2. 操作符重载基本语法:

     operator操作符()
    
     示例:
     	operator+()
     	operator<<()
     	operator->()
    
模版
模版参数可以是多个
  1. 类模版

     template //typename
     class{
     	//body
     }	
    

    示例:

template<typename T>
class complex{

public:

 complex(T r = 0,T i = 0): re(r),im(i){}
complex& opeerator +=(const complex&);
T real() const { return re;}
T imag() const {return im;}

private:
	T re,im;


	friend complex& __doapl(complex* ,const complex&);
}

使用:

complex c(2,3);
complex c1(1.2,3.56);
  1. 函数模版

     template   //class
     返回值 函数名(参数列表){
     		函数体
     }
    

示例:

	template
	const T& min(const T& a,const T& b){
		return a

使用:

	stone r2(2,3),r3(3,6),r33;
	r33 = min(r2,r3);
  1. 成员模版

     定义方式于函数模版相似,不同的是这个模版是在类中进行的定义。
     这个类可以是类模版也可以是普通类
    
class A{

	 template <typename T> void oop() const
    {
        cout  << "成员模版" << endl;
       
    }
}
模版的泛化和特化

模版的特化和偏特化:

1. 为了为某些特定的场景使用而进行的特化处理。这样做会比泛化模版的执行效率更高。同时还可以实现更多功能。
2. 模版的特化更注重于细节和功能的专注,就像以前做饼,做面,做米都用一个锅,特化之后做饼的一个锅,做面的一个锅,做米的一个锅。不论是实现还是功能上都做到了专用。

当模版参数列表中参数个数为多个的时候,会有特化,偏特化的分类:

  1. 泛化: 最基本的模版,类型可以任意指定的模版

  2. 特化: 指定类型的模版,就会变成特化的模版。

     (分为全特化和偏特化)
     	全特化: 参数类型全部被指定
     	偏特化: 部分参数类型被指定或者范围的指定
    
  3. 偏特化: 指定部分类型的模版,或者类型访问权限被限制的模版,就会成为偏特化的模版。

//模版的泛化
template<typename T1,typename T2>
class teClass{
public:
    Test(T1 t1,T2 t2):ta(t1),tb(t2){}
private:
    T1 ta;
    T2 tb;
};
//全特化,所以<>中不再有参数列表,而是将指定的参数列表放置在class中进行定义
template<>  
class teClass<int ,char>{
public:
    Test(int t1,char t2):ta(t1),tb(t2){l;}
private:
    int ta;
    int tb;
};
//偏特化,只有未被指定类型的参数出现在模版参数列表中
template<typename T2> 
class teClass<char,T2>{
public:
    Test(char t1,T2 t2):ta(t1),tb(t2){}
private:
    char ta;
    T2 tb;
};

/**

使用示例:
 	teClass t1(12.9,91.2);  //泛化
    teClass t2(99,'m');  //全特化
    teClass t3('n',0.99); //偏特化
   
*/
  

你可能感兴趣的:(C++)