C++:关于一段STL泛型编程程序的简单理解

最近看到了这么一段代码,趁机补习了一遍C++STL泛型编程的知识,于此记录一下。首先代码如下

//(1)定义了一个Item类型的结构体
typedef struct ITEM {
    unsigned int i;
    unsigned int j;
} Item;

//(2)声明了一个C++泛型结构体,类型名为A_less 
template    struct   A_less   :   public   binary_function  {
    bool   operator()(T   lhs,   T   rhs) const
    {
        if (lhs.i < rhs.i)
            return true;
        if (lhs.i == rhs.i)
            if (lhs.j < rhs.j)
                return true;
        return false;
    }
};
//(3)
typedef   map    >    IntMap;
typedef   map    > :: value_type   MVT;
typedef   map    > :: iterator   MapItor;

需要明白几个概念:

  1. C++结构体
    C的结构体只能封装一些单一的数据,不能含方法。但是C++的结构体和类是高度一致的,不仅有成员函数,还有构造函数,甚至可以指定成员的访问权限(如public和private)。C++结构体和类的唯一的差别在于,在不显示指定成员函数和变量的权限时,C++结构体默认是public,而类默认是private。其实C++之结构体其本质已经是和类一样了,之所以保留struct完全是为了兼容C语言。
  2. 模板类编程
    类模板的通式为:
    template class 类名{ ... };
    类模板是以template开始后接模板形参列表组成,模板形参不能为空,后边就是具体的类名。一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即在类中使用内置类型的地方都可以使用模板形参名来声明。比如下述表达。 在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy。当我们使用A实例化对象的时候,就可以这样用A Student
	template  class A{
		public: 
			T a; 
			T b; 
			T hy(T c, T &d);
			};

此外函数模板编程,需要注意的是,当声明和实现分开的时候都要声明template关键字,如下
在h文件里声明如下

class   CTag : public CObject
{
public:
    CString Name;//标签标识
public:
    template 
    void PutAVDVIntoTag(CDataAVDV *dataAV, VARIANT var, COPCServerView *pview, FILETIME ft);
};

在cpp文件实现的时候

template 
void CTag::PutAVDVIntoTag(CDataAVDV *dataAV, VARIANT var, COPCServerView *pview, FILETIME nowft)
{
.................
}
  1. operator关键字
    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator整体上视为一个函数名。如下inline bool operator == (const person &ps) const;这里就是在重写==这个运算符,而==的输入参数类型是person(&ps意思是输入参数的别名是ps)。详细的说明可以看这里
	class person{
		private:
		int age;
		public:
		person(int a){
			this->age=a;
		}
		inline bool operator == (const person &ps) const;
	};

为了方便我将C++结构体也称为类。
回到上述代码,首先模板形参名为T,声明的类型名为A_less,他的父类是C++提供的一个典型的二元函数模板binary_function。
在类A_less声明的内部,重载了()运算符。()的输入参数是类型正是声明的模板形参名T。然后通过内部两个元素的比较,返回()运算符的返回结果,返回结果是bool型。

  • typedef map > IntMap;
    这里重命名了一种关联容器IntMap,关键字类型是Item,值类型是int,而第三个参数规定了map中的元素的存储顺序规则。第三个参数缺省是从小到大排列,但是这是针对系统规定的内置类型,对于自写的类型Item要重新制定一套比较方法,于是重写了()运算符。而这个方法是用来比较某两个元素在容器内的先后的,true表示在前(括号里边第一个参数在第二个参数之前),false表示在后(第一个参数在第二个参数之后)。也就是说IntMap中的元素(pair)是按照关键字的i变量从小到大排列,如果i一样,比较j,j小的排列在前。
  • typedef map > :: value_type MVT;
    关键字value_type代表的是Map当中元素的类型,在该段代码当中就是pair
    什么是pair?
    我们可以把一个map想象成一个下标类型为key,值类型为value的数组。既然是数组,那必然含有多个元素,我们将Map的元素称作是pair,而pair的数据类型(也就是map存放数据的数据类型)我们统一称作value_type。

你可能感兴趣的:(C++,C++标准库)