zoukankan      html  css  js  c++  java
  • C++笔记------模版

    模版-----是为了让代码更加通用,使代码不受数据类型的影响。减少代码冗余。模版将数据类型当作一个参数进行传递。包括函数模版和类模板。

    函数模版:

    //定义一个比较大小的函数模版
    template<typename Type>  // 也可以写成 template <class Type>
    Type Max(Type a,Type b)
    {
        return a > b ? a : b;
    }
    int main()
    {
        cout << Max(1,2) << endl;
        cout << Max('A', 'a') << endl;
        cout << Max(2.5,3.2) << endl;
        return 0;
    }

      模版会根据传递的实参自动进行数据类型的推演,比如在Max(2.5,2.3)中,模版会根据2.5是double,2.3是double,模版会推导出Type是double类型,生成一个模版函数,使用double类型的比较函数。所以模版虽然方便,但是效率不高。

      比如,调用函数Max(1,2)时,编译器会先根据函数模版生成一个int类型的模版函数,然后在调用这个函数。

    //模版函数
    int
    Max(int a, int b) { return a > b ? a : b }

      当出现实参类型不一致时,普通函数正常运行,模版会出现错误,如:

    /*
    template<typename Type> //会产生二义性 Type Max(Type a,Type b) { return a > b ? a : b; }
    */ int Max(int a,int b) //会自动进行隐式转换 { return a > b ? a : b; } int main() { cout << Max(1,2.3) << endl;
    cout << Max(1,(int)2.3) << endl; //将2.3强制转换成int类型
    cout << Max<int>(1,2.3) << endl; //指定调用int类型的模版函数 }

      也可以重新编写模版函数,如:

    template<typename Type1, typename Type2>
    Type2 Max(Type1 a,Type2 b)
    {
        return a > b ? a : b;
    }

    如果是类对象进行比较,需要重载比较运算符。模版只负责比较,不管如何进行比较。

    class Test
    {
        int num;
    public:
        Test(int b):num(b){}
        bool operator>(const Test & t)
        {
            if (this->num > t.num)
                return true;
            else 
                return false;
        }
    };
    template<typename Type1>
    Type1 Max(Type1 a,Type1 b)
    {
        return a > b ? a : b;
    }
    int main()
    {
        Test t1(10);
        Test t2(9);
        Max(t1,t2);  //不能使用cout输出,因为没有提供<<运算符函数
    }

    类模板: 

      利用类模板简单实现线性链表。

       int a = int(); //将a初始化为0;
      模版类成员函数都是模版函数,不允许将类定义和实现分离

    #include <iostream>
    using namespace std;
    //声明List类
    template<typename Type>
    class List; 
    template
    <typename Type> class ListNode { private: Type data; ListNode<Type> *next; public: friend class List<Type>; //将List类成为ListNode类的友元类,才能访问私有数据 ListNode():data(Type()),next(NULL){} //零初始化:根据不同类型进行初始化。如,int a = int() //a被初始化为0。 ListNode(Type d,ListNode<Type> *n = NULL):data(d),next(n){} ~ListNode(){} }; template<typename Type> class List { private: ListNode<Type> *first; ListNode<Type> *last; size_t size; public: List(); ~List(); bool push_back(Type x); //尾部插入链表
    //显示列表函数
    void Show_list() const //模版类的成员函数可以在类内部定义 { ListNode<Type> *p=first; while(p != NULL) { cout << p->data; p = p->next; } } }; template<typename Type> //模版类的成员函数都是模版函数,所以必须写template<typename Type> List<Type>::List() //限定是List<Type>:: { first = last = new ListNode<Type>; last->next = NULL; size=0; } template<typename Type> List<Type>::~List() { ListNode<Type> *p=first; while(p != NULL) { first = p->next; delete p; //在构造函数中使用new,则在析构函数中使用delete size--; p=first; } } template<typename Type> bool List<Type>::push_back(Type x) { ListNode<Type> *s = new ListNode<Type>; if( s == NULL ) return false; s->data = x; s->next = NULL; last->next = s; last = s; return true; } int main() { List<int> mylist; for(int i=1;i<10;i++) { mylist.push_back(i); } mylist.Show_list(); return 0; }
  • 相关阅读:
    [协同过滤] : 交替最小二乘法
    Hadoop 学习笔记3 Develping MapReduce
    Spark MLib 基本统计汇总 2
    Spark MLib 基本统计汇总 1
    MySQL 语句遇到关键字
    Spark MLib 数据类型
    Android中的文件下载——DownLoadManager
    [UWP]了解模板化控件(4):TemplatePart
    [UWP]了解模板化控件(5):VisualState
    [UWP]了解模板化控件(5.1):TemplatePart vs. VisualState
  • 原文地址:https://www.cnblogs.com/zhangzeze/p/8717968.html
Copyright © 2011-2022 走看看