【C++基礎十】泛型編程(模板初階)

【C++基礎十】泛型編程—模板

  • 1.什么是模板
  • 2.函數模板的實例化:
    • 2.1隱式實例化
    • 2.2顯示實例化
  • 3.函數模板參數的匹配規則
  • 4.什么是類模板
  • 5.類模板的實例化
  • 6.聲明和定義分離

1.什么是模板

void swap(int& a, int& b)
{int tmp = 0;tmp = a;a = b;b = tmp;
}void swap(double& a, double& b)
{double tmp = 0;tmp = a;a = b;b = tmp;
}void Swap(char& a, char& b)
{char temp = a;a = b;b = temp;
}

正常來說,對于不同類型的變量進行交換,需要實現不同的swap函數,這樣實現有些太繁瑣了
為了解決相似函數的不同調用問題,C++提出泛型編程,編寫與類型無關的通用代碼,實現代碼復用,即模板
模板主要分為函數模板和類模板

模板格式:

template <typename T1, typename T2,,typename Tn>//一次性可以定義多個類型

typename是用來定義模板參數的關鍵字,也可以使用class,兩者目前是沒區別的,但是由于STL大部分用的class,所以建議使用class

template <class T1, class T2,,class Tn>//一次性可以定義多個類型

swap函數模板:

template <class T>
void Swap(T& a, T& b)
{T temp = a;a = b;b = temp;
}

寫好上面的代碼后,傳int類型的變量進去,T就會被實例化為int,以此類推

2.函數模板的實例化:

2.1隱式實例化

實參傳給形參后,編譯器自動推演模板類型

template <class T>
T add(T& left, T& right)
{return left + right;
}
int main()
{int a = 1;int b = 2;double p1 = 1.0;double p2 = 2.0;//同類型進行可以正常運行add(a, b);//自動推演類型為intadd(p1, p2);//自動推演類型為double//-----------addd(a, p1);//a與p1是不同類型,會報錯return 0;
}

不同類型去模板推演會出現歧義,a傳過去將T推演成int,而p1傳過去把T推演成double,T無法確定推演int還是double

2.2顯示實例化

在函數名后的<>中指定模板參數的類型

template <class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.1, d2 = 20.1;Add<int>(a1, d1);//顯示實例化
}

指定T的類型為int ,因為d1是double類型,所以在傳參時會發生隱式類型轉換變成int,若無法轉換成功編譯器將會報錯

3.函數模板參數的匹配規則

模板函數和普通函數可以同時存在
通過調試可以發現調用的是普通函數,因為成本更低,使用模板還需要實例化生成代碼,而普通函數可以直接使用

// 專門處理int的加法函數
int Add(int left, int right)
{return left + right;
}
// 通用加法函數
template<class T>
T Add(T left, T right)
{return left + right;
}int main()
{Add(10,20)//調用非模板Add(11.1,6.3);//調用模板return 0;
}

在調用函數時若參數和非模板函數匹配,那么編譯器會優先調用非模板函數
若非模板函數不匹配或模板函數更匹配,那么編譯器會優先調用模板函數

4.什么是類模板

template <class T1, class T2,, class Tn>//和函數模板類似,類模板也可以同時定義多個模板參數
class 類模板名
{// 類內成員定義
};

有typedef的存在為什么還有類模板?

typedef int STdatatype;
class stack
{
private:STdatatype* _a;size_t top;size_t capacity;
};int main()
{stack s1;//想要S1存儲intstack s2;//想要S2存儲doublereturn 0;
}

如果想要改變棧儲存的類型可以選擇改變typedf定義的類型
但是若想要兩個棧分別儲存不同的數據類型typedef做不到
兩份類的代碼幾乎是一致的,但若想達到目的就需要再拷貝一份出來,就太繁瑣了

一個簡易的順序表:
所有實際類型需要出現的地方用T代替

template<class T>
class Vector
{ 
public :Vector(size_t capacity = 10): _Data(new T[capacity]), _size(0), _capacity(capacity){}T& operator[](size_t pos){assert(pos < _size);return _Data[pos];}
private:T* _Data;size_t _size;size_t _capacity;
};

5.類模板的實例化

類模板只能顯示實例化,這樣就可以達到s1存儲int,S2存儲double

template <class T>
class stack
{
public:stack(int capacity=4){_a = new T[capacity];_top = 0;_capacity = capacity;}~stack(){delete[]_a;_capacity = _top = 0;}
private:T* _a;size_t top;size_t capacity;
};int main()
{stack <int>s1;//想要S1存儲intstack <double>s2;//想要S2存儲doublereturn 0;
}

6.聲明和定義分離

對于模板,vector是類名而不是類型,加上實例化的模板參數后vector<T>才是類型
析構函數在類外面定義 ,需要使用類型 vector < T>,而T作為模板需要調用template < class T >
必須要再加上類模板template并且要指定類域

template<class T>
class Vector
{ 
public:Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}~Vector();//類中的聲明析構函數void push_back(T x);//類中聲明函數
private:T* _Data;size_t _size;size_t _capacity;
};template <class T>//析構函數在類外面定義 要加上模板
Vector<T>::~Vector()
{detele[]_pData;_pData = nullptr;_size = _capacity = 0;
}template<class T>//模板類的函數在類外定義,要加上模板
void Vector<T>::push_back(T x)
{_Date[_size] = x;_size++;
}int main()
{Vector<int> v;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898077.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何修復 Tauri 發布后程序運行時顯示 `asset not found: index.html` 的問題

如何修復 Tauri 發布后程序運行時顯示 asset not found: index.html 的問題 在使用 Tauri 發布應用程序時&#xff0c;如果運行時出現 asset not found: index.html 的錯誤&#xff0c;通常是因為 Tauri 無法找到或正確加載前端資源文件&#xff08;如 index.html&#xff09;…

短視頻下載去水印,用什么工具好?

去除視頻和圖片水印是許多用戶的需求&#xff0c;尤其是在分享或保存內容時。以下是6款超好用的工具&#xff0c;幫助你輕松去除水印&#xff0c;享受純凈的視覺體驗&#xff1a; 1. 易下載去水印小程序 特點&#xff1a; 操作簡單&#xff0c;支持抖音、快手、小紅書、嗶哩嗶哩…

【華為OD-E卷 -121 消消樂游戲 100分(python、java、c++、js、c)】

【華為OD-E卷 - 消消樂游戲 100分(python、java、c++、js、c)】 題目 游戲規則:輸入一個只包含英文字母的字符串,字符串中的兩個字母如果相鄰且相同,就可以消除。 在字符串上反復執行消除的動作,直到無法繼續消除為止,此時游戲結束。 輸出最終得到的字符串長度 輸入描…

設計模式(行為型)-備忘錄模式

目錄 定義 類圖 角色 角色詳解 &#xff08;一&#xff09;發起人角色&#xff08;Originator&#xff09;? &#xff08;二&#xff09;備忘錄角色&#xff08;Memento&#xff09;? &#xff08;三&#xff09;備忘錄管理員角色&#xff08;Caretaker&#xff09;?…

YOLO簡史:從YOLOv1到YOLOv12的技術革新與演進

YOLO&#xff08;You Only Look Once&#xff09;系列算法自2015年誕生以來&#xff0c;憑借其“單次推理”的高效特性&#xff0c;徹底改變了目標檢測領域。從初代YOLO到最新的YOLOv12&#xff0c;每一次迭代都凝聚了研究者的智慧與工業界的實踐需求。本文梳理各版本的特性、技…

【技術報告】谷歌開源多模態大模型 Gemma-3

【技術報告】谷歌開源多模態大模型 Gemma-3 1. Gemma-3 簡介1.1 Gemma-3 的新功能1.2 與現有工作流的集成1.3 開始使用 Gemma-3 Gemma-3 技術報告&#xff1a;摘要Gemma-3 技術報告&#xff1a;1. 引言Gemma-3 技術報告&#xff1a;2. 模型架構2.1 視覺模態2.2 預訓練2.3 量化感…

[ISP] 人眼中的顏色

相機是如何記錄顏色的&#xff0c;又是如何被顯示器還原的&#xff1f; 相機通過記錄RGB數值然后顯示器顯示RGB數值來實現顏色的記錄和呈現。道理是這么個道理&#xff0c;但實際上各廠家生產的相機對光的響應各不相同&#xff0c;并且不同廠家顯示器對三原色的顯示也天差地別&…

InfiniBand可靠連接(RC)模式:設計原理、核心機制與應用實踐

引言 InfiniBand作為一種高性能網絡互連技術&#xff0c;廣泛應用于超算集群、分布式存儲和金融交易系統等領域。其可靠連接&#xff08;Reliable Connection, RC&#xff09;模式以硬件級的有序性、可靠性和低延遲特性成為關鍵場景的首選。本文結合技術原理、機制對比和實際應…

【網絡】Caddy 服務器如何提供 TLS(Transport Layer Security)(傳輸層安全協議)

這張圖片介紹了 Caddy 服務器如何提供 TLS&#xff08;傳輸層安全協議&#xff09; 支持&#xff0c;確保通信的安全性。以下是對圖片內容的詳細分析 1. Caddy 是什么&#xff1f; Caddy 是一個現代化的 Web 服務器&#xff0c;以其簡單易用和自動化的 HTTPS 支持而聞名。它內…

GHCTF web方向題解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

《Python實戰進階》No21:數據存儲:Redis 與 MongoDB 的使用場景

第21集&#xff1a;數據存儲&#xff1a;Redis 與 MongoDB 的使用場景 摘要 在現代應用開發中&#xff0c;數據存儲的選擇直接影響系統的性能、擴展性和成本。Redis 和 MongoDB 是兩種極具代表性的數據庫技術&#xff0c;它們分別擅長解決不同場景下的問題。本文將深入探討 Re…

【Agent】OpenManus-Prompt組件詳細分析

1. 提示詞架構概述 OpenManus 的提示詞組件采用了模塊化設計&#xff0c;為不同類型的智能體提供專門的提示詞模板。每個提示詞模塊通常包含兩種核心提示詞&#xff1a;系統提示詞&#xff08;System Prompt&#xff09;和下一步提示詞&#xff08;Next Step Prompt&#xff0…

藍橋杯刷題周計劃(第三周)

目錄 前言題目一題目代碼題解分析 題目二題目代碼題解分析 題目三題目代碼題解分析 題目四題目代碼題解分析 題目五題目代碼題解分析 題目六題目代碼題解分析 題目七題目代碼題解分析 題目八題目代碼題解分析 題目九題目代碼題解分析 題目十題目代碼題解分析 前言 大家好&#…

mysql學習-常用sql語句

1、安裝mysql參考網上鏈接&#xff0c;進入mysql數據庫 mysql -u root -p 2、數據庫操作 2.1、創建數據庫 create database 數據庫名 default character set utf8; 2.2、顯示所有數據庫 show databases; 2.3、選擇數據庫 use elementInfo; 2.4、刪除數據庫 drop database…

(全)2024下半年真題 系統架構設計師 綜合知識 答案解析01

系統架構設計師第二版教程VIP課程https://edu.csdn.net/course/detail/40283 操作系統 下列選項中不能作為預防死鎖措施的是 。 A. 破壞“循環等待"條件 B. 破壞“不可搶占”條件 C. 破壞“互斥”條件 D. 破壞“請求和保持”條件 答案&#xff1a;C 解析&…

Java泛型程序設計使用方法

Java泛型程序設計是Java語言中一項強大的特性&#xff0c;它允許你編寫更加通用和類型安全的代碼。以下是Java泛型程序設計的使用方法和技巧&#xff1a; 1. 基本概念 泛型類&#xff1a;可以定義一個類&#xff0c;其中的某些類型是參數化的。 public class Box<T> {pr…

LeetCode算法心得——零數組變換IV(0-1背包)

大家好&#xff0c;我是晴天學長&#xff0c;很久很久沒有寫算法題解了&#xff0c;今天開始轉python了。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1&#xff09;統計打字方案數 給你一個長度為 n 的整數數組 nums 和一個二維數組 queries &#xff0c;其中 queries[i] [li, …

superset部署記錄

具備網絡條件的&#xff0c;完全可以一鍵部署&#xff0c;不需要折騰。網絡條件不具備時&#xff0c;部署記錄留存備查。 1、正常模式 詳細介紹參考&#xff1a;【開源項目推薦】Apache Superset——最優秀的開源數據可視化與數據探索平臺-騰訊云開發者社區-騰訊云 (tencent.c…

AI大模型完全指南:從核心原理到行業落地實踐

目錄 大模型技術演進脈絡核心原理解析與數學基礎主流大模型架構對比開發環境搭建與模型部署Prompt Engineering高階技巧垂直領域應用場景實戰倫理與安全風險防控前沿發展方向與學習資源 一、大模型技術演進脈絡 1.1 發展歷程里程碑 2017&#xff1a;Transformer架構誕生&…

HTB 學習筆記 【中/英】《前端 vs. 后端》P3

&#x1f4cc; 這篇文章講了什么&#xff1f; 介紹了 前端&#xff08;客戶端&#xff09; 和 后端&#xff08;服務器端&#xff09; 的區別。解釋了 全棧開發&#xff08;Full Stack Development&#xff09;&#xff0c;即前端后端開發。介紹了 前端和后端常用的技術。討論…