zoukankan      html  css  js  c++  java
  • C++ 基础 6:模板

    1 函数模板

    泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意。

    泛型编程 的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。 泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数 T。

    所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为 函数模板

    1.1 函数模板的引入

    语法格式如下:

    template <typename T>
    返回类型 函数模板名(函数参数列表)
    {
          函数模板定义体
    }
    

    template 是语义是模板的意思,尖括号中先写关键字 typename 或是 class,后面跟一个类型 T,此类即是虚拟的类型。至于为什么用 T,用的人多了,也就是 T 了。

    1.2 函数模板的实例

    // funcTemplate.cpp,函数模板
    
    #include <iostream>
    
    using namespace std;
    
    template <typename T>
    void mySwap(T &a, T &b)
    {
    	T t = a;
    	a = b;
    	b = t;
    }
    
    int main()
    {
    	int x = 1;
    	int y = 2;
    
    	mySwap(x,y);
    	cout << "x:" << x << ",y:" << y << endl;
    
    	mySwap<int>(x,y);
    	cout << "x:" << x << ",y:" << y << endl;
    
    	char a = 'a';
    	char b = 'b';
    
    	mySwap(a,b);
    	cout << "a:" << a << ",b:" << b << endl;
    
    	mySwap<char>(a,b);
    	cout << "a:" << a << ",b:" << b << endl;
    
    	return 0;
    }
    

    运行结果:

    函数模板,只适合函数的参数个数相同而类型不同,且函数体相同的情况。如果个数不同,则不能用函数模板。

    2 类模板

    2.1 类模板定义

    类模板与函数模板的定义和使用类似,我们已经进行了介绍。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,所以将类中的类型进行泛化。

    语法格式如下:

    template <typename T>
    class 类名
    {
       
    }
    

    2.2 类模板的实例

    下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:

    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <string>
    #include <stdexcept>
     
    using namespace std;
     
    template <class T>
    class Stack { 
      private: 
        vector<T> elems;          // 元素 
     
      public: 
        void push(T const&);      // 入栈
        void pop();               // 出栈
        T top() const;            // 返回栈顶元素
        bool empty() const{       // 如果为空则返回真。
            return elems.empty(); 
        } 
    }; 
     
    template <class T>
    void Stack<T>::push (T const& elem) 
    { 
        // 追加传入元素的副本
        elems.push_back(elem);    
    } 
     
    template <class T>
    void Stack<T>::pop () 
    { 
        if (elems.empty()) { 
            throw out_of_range("Stack<>::pop(): empty stack"); 
        }
        // 删除最后一个元素
        elems.pop_back();         
    } 
     
    template <class T>
    T Stack<T>::top () const 
    { 
        if (elems.empty()) { 
            throw out_of_range("Stack<>::top(): empty stack"); 
        }
        // 返回最后一个元素的副本 
        return elems.back();      
    } 
     
    int main() 
    { 
        try { 
            Stack<int>         intStack;  // int 类型的栈 
            Stack<string> stringStack;    // string 类型的栈 
     
            // 操作 int 类型的栈 
            intStack.push(7); 
            cout << intStack.top() <<endl; 
     
            // 操作 string 类型的栈 
            stringStack.push("hello"); 
            cout << stringStack.top() << std::endl; 
            stringStack.pop(); 
            stringStack.pop(); 
        } 
        catch (exception const& ex) { 
            cerr << "Exception: " << ex.what() <<endl; 
            return -1;
        } 
    }
    

    当上面的代码被编译和执行时,它会产生下列结果:

    7
    hello
    Exception: Stack<>::pop(): empty stack
    
  • 相关阅读:
    Bubble Sort (5775)
    Dertouzos (5750)
    codeforces 360 E
    codeforces 360 D
    codeforces 360 C
    Mike and Cellphone
    训练2——B
    训练1——A
    符号三角形
    Sudoku Killer
  • 原文地址:https://www.cnblogs.com/PikapBai/p/13263467.html
Copyright © 2011-2022 走看看