• 11、【C++基础】模板


    C++ 模板

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

    模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

    每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int>vector <string>

    您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。

    函数模板

    函数模板,模板函数,模板类

    在这上面三条语句当中,int float char 这三种数据类型,但是他们具体实现的函数是一样的,所以我们就是想把函数作为参数传入进去,然后让计算机帮我们实现这三条语句的编写

    函数模板:关键字:template;typename;class

    函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。

    函数模板的声明形式为:

    1 template<typename 数据类型参数标识符>
    2 <返回类型><函数名>(参数表)
    3 {
    4     函数体
    5 }

    【实例】

     1 #include <iostream>
     2 #include <string>
     3  
     4 using namespace std;
     5  
     6 template <typename T>
     7 inline T const& Max (T const& a, T const& b) 
     8 { 
     9     return a < b ? b:a; 
    10 } 
    11 int main ()
    12 {
    13  
    14     int i = 39;
    15     int j = 20;
    16     cout << "Max(i, j): " << Max(i, j) << endl; 
    17  
    18     double f1 = 13.5; 
    19     double f2 = 20.7; 
    20     cout << "Max(f1, f2): " << Max(f1, f2) << endl; 
    21  
    22     string s1 = "Hello"; 
    23     string s2 = "World"; 
    24     cout << "Max(s1, s2): " << Max(s1, s2) << endl; 
    25  
    26    return 0;
    27 }

    执行结果:

    Max(i, j): 39
    Max(f1, f2): 20.7
    Max(s1, s2): World
    

    类模板

    正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示:

    1 template <class type> class class-name {
    2 .
    3 .
    4 .
    5 }

    在这里,type 是占位符类型名称,可以在类被实例化的时候进行指定。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。

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

     1 #include <iostream>
     2 #include <vector>
     3 #include <cstdlib>
     4 #include <string>
     5 #include <stdexcept>
     6  
     7 using namespace std;
     8  
     9 template <class T>
    10 class Stack { 
    11   private: 
    12     vector<T> elems;     // 元素 
    13  
    14   public: 
    15     void push(T const&);  // 入栈
    16     void pop();               // 出栈
    17     T top() const;            // 返回栈顶元素
    18     bool empty() const{       // 如果为空则返回真。
    19         return elems.empty(); 
    20     } 
    21 }; 
    22  
    23 template <class T>
    24 void Stack<T>::push (T const& elem) 
    25 { 
    26     // 追加传入元素的副本
    27     elems.push_back(elem);    
    28 } 
    29  
    30 template <class T>
    31 void Stack<T>::pop () 
    32 { 
    33     if (elems.empty()) { 
    34         throw out_of_range("Stack<>::pop(): empty stack"); 
    35     }
    36     // 删除最后一个元素
    37     elems.pop_back();         
    38 } 
    39  
    40 template <class T>
    41 T Stack<T>::top () const 
    42 { 
    43     if (elems.empty()) { 
    44         throw out_of_range("Stack<>::top(): empty stack"); 
    45     }
    46     // 返回最后一个元素的副本 
    47     return elems.back();      
    48 } 
    49  
    50 int main() 
    51 { 
    52     try { 
    53         Stack<int>         intStack;  // int 类型的栈 
    54         Stack<string> stringStack;    // string 类型的栈 
    55  
    56         // 操作 int 类型的栈 
    57         intStack.push(7); 
    58         cout << intStack.top() <<endl; 
    59  
    60         // 操作 string 类型的栈 
    61         stringStack.push("hello"); 
    62         cout << stringStack.top() << std::endl; 
    63         stringStack.pop(); 
    64         stringStack.pop(); 
    65     } 
    66     catch (exception const& ex) { 
    67         cerr << "Exception: " << ex.what() <<endl; 
    68         return -1;
    69     } 
    70 }

    执行结果:

    7
    hello
    Exception: Stack<>::pop(): empty stack
  • 相关阅读:
    设备上下文-CDC绘图细节
    程序设计思想-1
    消息反射--针对通知消息
    R语言-数据类型与运算符
    背景色与WM_ERASEBKGND
    IDEA 2017.3 新版本中创建 JSF Web 应用程序缺少 web.xml 的解决办法
    在 Fedora 26/27 GNOME 3.24/3.26 环境中安装 FCITX 小企鹅输入法(修订)
    Linux 环境下安装配置 TigerVNC Server 并启用当前会话远程服务(X0VNC)
    关于 gstreamer 和 webrtc 的结合,有点小突破
    VMware Workstation/Fusion 中安装 Fedora 23/24 及其他 Linux 系统时使用 Open VM Tools 代替 VMware Tools 增强工具的方法
  • 原文地址:https://www.cnblogs.com/Long-w/p/9432161.html
Copyright © 2020-2023  润新知