<th id="wu2k2"><s id="wu2k2"></s></th> <blockquote id="wu2k2"></blockquote>
  • <tr id="wu2k2"></tr>
  • <samp id="wu2k2"><tbody id="wu2k2"></tbody></samp><samp id="wu2k2"><tbody id="wu2k2"></tbody></samp>
  • 更多精彩內容,歡迎關注:

    視頻號
    視頻號

    抖音
    抖音

    快手
    快手

    微博
    微博

    c++ template用法

    文檔

    c++ template用法

    c++ template用法是在一個程序中可以使用多個隊列、樹、圖等結構來組織數據時,通過c++ template對同種類型數據結構僅定義一次避免麻煩與出錯。
    推薦度:
    導讀c++ template用法是在一個程序中可以使用多個隊列、樹、圖等結構來組織數據時,通過c++ template對同種類型數據結構僅定義一次避免麻煩與出錯。

    c++ template用法是什么呢?一起來看看小編今天的分享吧!

    在程序設計當中經常會出現使用同種數據結構的不同實例的情況。例如:在一個程序中可以使用多個隊列、樹、圖等結構來組織數據。同種結構的不同實例,也許只在數據元素的類型或數量上略有差異,如果對每個實例都重新定義,則非常麻煩且容易出錯。那么能否對同種類型數據結構僅定義一次呢?答案是肯定的,C++提供的類模板(Class Template)就可以實現該功能。

    ????一、類模板????類模板是C++提供的一種特殊機制,通過它我們可以定義一種特殊的類(稱為模板類),在類的定義中可以包含待定的類型參數,在聲明類的實例時,系統會自動根據傳遞的類型生成用戶想要生成的類實例。下面是用C++實現的一個簡單的模板類Clist的定義。

    ????Template?class?CList
    ????{
    ????public:
    ????int?SetItem(int?Index,?const?T?&Item);
    ????int?GetItem(int?Index,?T?&Item);
    ????private:
    ????T?Buffer;
    ????}

    ????在這里,T是類型參數,I是整型常量參數。T和I的實際值是在聲明具體類實例時指定的。

    模板類的<>號內可以包括任意個類型參數和常量參數(至少要有一個參數)。類型參數和常量參數可以是任何合法的標準類型和用戶自定義類型,包括簡單類型及各種結構體。同其他類一樣,類成員函數SetItem的實現可以在類定義內完成,也可以在類CList定義處實現:

    ????template?int?CList::SetItem(int?Index,?const?T?&Item)
    ????{
    ????if?(?(IndexI-1)?)
    ???? return?0;?//?出錯
    ????Buffer[Index]=?Item?;
    ???? return?1;?//?成功
    ????}

    ????值得注意的是,在類定義外完成函數實現時,必須以關鍵字template和類模板定義中相同的參數表(<>號內的)開頭(上例為template),并且范圍分解操作符前的類名后應跟上模板參數名清單(上例為CList)。另外,與非模板類不同的是,必須將函數實現包括在調用它的每個源文件中,使編譯器能從函數實現產生代碼。通常的做法是將模板類的函數實現也放在定義該類的頭文件中,這樣只需在調用的源文件中包含該頭文件即可。那么,如何使用生成特定的類實例呢?我們可以像使用其他類一樣來使用模板類,不過必須指定模板參數的值。例如采用如下聲明:

    ????CList?IntList;

    則使IntList成為CList類的實例,每次出現的T參數都換成int, 每次出現的I參數都換成100。這樣,IntList類中的Buffer就是一個長度為100的整型數組,SetItem和GetItem函數參數是int值的引用。例:

    ????IntList.SetItem(0,?5);?//給數組第一個元素賦為整數5

    ? ??模板類還可以像其他類一樣可以定義構造函數和析構函數。下面我們以一種簡單的數據結構——堆棧為例,來說明如何用類模板來構造通用數據結構。

    二、利用類模板實現通用堆棧結構

    ? ??任何抽象數據結構在計算機中的實現,歸根結底都只有兩種方式:順序存儲(用數組實現)?,鏈式存儲(用指針實現)。堆棧也不例外,按其實現方式可分為順序棧(用數組實現)和鏈棧(用指針實現)。

    1. 通用順序棧的實現? ??因為順序棧中的元素在空間上連續存儲,棧頂的元素位置需要注明,所以構造順序棧的模板類應該有這樣的一些成員變量:一個待定類型和長度的數組Buffer,一個記錄棧頂元素的數組下標的整型變量top。堆棧的基本操作主要有:入棧(Push)、出棧(Pop)、置空(SetEmpty)、判斷當前狀態(IsEmpty)等,它們應用模板類的成員函數來實現。作為一個標準的類,它還應該有自己的構造函數和析構函數。具有這些功能的模板類,就可以作為一個通用的順序棧來使用了。該類的定義如下:

    ????template?class?CArrayStackTemp
    ????{
    ????public:
    ????CArrayStackTemp?()?//缺省構造函數,構造一個空堆棧
    ????{
    ????top=?-1;
    ????};
    ????~?CArrayStackTemp?(){};//析構函數
    ???? void?SetEmpty?();?//置空堆棧
    ???? bool?IsEmpty();?//判斷堆棧是否為空
    ???? bool?Push(T?element);?//入棧
    ???? bool?Pop(T&?element);//出棧
    ????private:
    ????T?Buffer[SIZE];
    ???? int?top;
    ????};

    與堆棧的基本操作相對應的成員函數的實現如下:

    ????template?void?CArrayStackTemp::?SetEmpty?()
    ????{
    ????top=?-1;?//將棧頂指針賦?-1,并不實際清除數組元素
    ????}
    ????template?bool?CArrayStackTemp::?IsEmpty?()
    ????{
    ????return(top?==?-1);
    ????}
    ????template?bool?CArrayStackTemp::?Push?(T?element
    ????)
    ????{
    ????top++;
    ????if?(top>SIZE-1)
    ????{
    ????top--;
    ????return?false;?//堆棧已滿,不能執行入棧操作
    ????}
    ????Buffer[top]=element;
    ????return?true;
    ????}
    ????template?void?CArrayStackTemp::?Pop?(T&?element
    ????)
    ????{
    ????if?(IsEmpty())
    ???? return?false;
    ????element?=Buffer[top];
    ????top--;
    ????return?true;
    ????}

    根據實際需要,還可以擴充堆棧功能。例如:加入取棧頂元素、求堆棧長度等操作,其方法如上。

    2. 通用鏈棧的實現? ??模板類中允許使用指針和定義自己的結構,這就為實現鏈式結構提供了保證。這里采用一個單鏈表來實現堆棧,棧頂指針指向鏈表的第一個結點,入棧和出棧均在鏈表的頭進行。該模板類的定義如下:

    ????template?class?CLinkStackTemp
    ????{
    public:
    ???? //類的缺省構造函數,生成一個空堆棧
    ????CLinkStackTemp?()
    ????{
    ????top=NULL;
    ????};
    ????~ClinkStackTemp(){};?//析構函數
    ???? //定義結點結構
    ???? struct?node
    ????{
    ????T
    ???? ?data;?//入棧元素
    ???? node*?next;?//指向下一結點的指針
    ????};
    ???? void?SetEmpty();?//置空堆棧
    ???? bool?IsEmpty();?//判斷堆棧是否為空
    ???? bool?Push(T?element);?//壓入堆棧
    ???? bool?Pop(T&?element);//彈出堆棧
    ????private:
    ???? node*?top;
    ????};

    ????該類的成員函數實現如下:

    ????template?void?CLinkStackTemp?::SetEmpty()
    ????{
    ????//釋放堆棧占用的內存
    ????node*?temp;
    ????while?(top!=NULL)
    ????{
    ???? temp=top;
    ???? top=top->next;
    ???? delete?temp;
    ????}
    ????}
    ????template?bool?CLinkStackTemp?::IsEmpty()
    ????{
    ????return?(top==NULL);
    ????}
    ????template?bool?CLinkStackTemp?::Push(T?element)
    ????{
    ????node*?temp=new?node();
    ????if?(temp?==NULL)
    ???? return?false?;
    ????temp->data=element;
    ????temp->next=top;
    ????top=temp;
    ????return?true;
    ????}
    ????template?bool?CLinkStackTemp?::Pop(T&?element)
    ????{
    ????if?(?IsEmpty())
    ???? return?false;
    ????node*?q?=?top;
    ????element?=?top->data;
    ????top=top->next;
    ????delete?q;
    ????return?true;
    ????}

    ? ??與順序棧的實現略有不同,鏈棧不必指定棧的容量,其大小可以是近似"無限"的。為了程序的使用方便,我們同樣可以加入一些增強的功能。

    三、通用堆棧類的使用

    ? ??通用堆棧類的使用較為簡單,堆棧類的實例就是一個可以方便使用的堆棧。對堆棧的操作都是通過類的成員函數來實現的。使用的具體步驟如下:1. 在要使用堆棧類的程序代碼的文件開頭包括模板類及其成員函數的定義。

    2. 類的實例化,可聲明成變量,也可以聲明它的指針,如:

    ????CArrayStackTemp?intStack;?//生成一個長度為100的int型堆棧
    ????//生成一個元素為Record型的堆棧,Record為自定義結構
    ????CLinkStackTemp?*?RecordStack;
    ????RecordStack=new?CLinkStackTemp;

    ? ??應注意在定義順序棧時,必須指定棧的大小,而鏈棧則不必。另外在指定指針類型和執行new操作時,必須對模板參數賦值,并且前后要一致。3. 對堆棧進行操作,如:

    ????intStack.Push(3);?//將整數3入棧
    ????RecordStack.SetEmpty();?//將堆棧置空

    無論我們使用哪種堆棧類,對用戶來講都是透明的,操作起來并無差別。

    以上就是小編今天的分享了,希望可以幫助到大家。

    文檔

    c++ template用法

    c++ template用法是在一個程序中可以使用多個隊列、樹、圖等結構來組織數據時,通過c++ template對同種類型數據結構僅定義一次避免麻煩與出錯。
    推薦度:
    為你推薦
    資訊專欄
    熱門視頻
    相關推薦
    python split函數 python查看變量類型 python組合數據類型 python讀取json python split函數用法 python類型轉換 python input函數怎么用 python強制類型轉換 python查看已安裝的包 python判斷字符串相等 python內置函數 python遞歸函數 python類的繼承 python string函數 python構造函數 python延時函數 debug error怎么解決 python讀取json并解析 python 列表添加 python字典按值的大小排序 老抽和生抽的區別 拉鏈下滑如何解決 防藍光眼鏡怎么辨別 蔥怎么保存 老姜和生姜的區別 新鮮蘑菇怎么保存 豬腳和豬手有什么區別 亞麻籽油是什么油 白茶保存方法和時間 水晶粉是什么面粉 艾素糖是什么糖 奶酪棒是什么做的 烤布蕾和蛋撻的區別 黃酒和料酒的區別 蜜棗和紅棗的區別 葡萄酒和紅酒的區別 紫砂鍋怎么用 一碼通怎么注銷重新注冊 國內手機銷量排行榜2021前十名 蘋果13有必要買pro嗎
    Top 国产精品电影网在线好看| 日韩人妻无码精品一专区| 国产精品香蕉一区二区三区| 国产成人精品综合久久久久 | 青青久久精品国产免费看| 国产精品嫩草影院一二三区入口 | 久久国产精品99精品国产| 久久精品国产国产精品四凭| 69精品人人人人人人人人人| 亚洲精品午夜久久久伊人| 精品国产污污免费网站| 国产精品最新国产精品第十页 | 国产精品一区二区三区99| 日韩精品一区二区三区中文3d| 91精品国产成人网在线观看| 久久九九AV免费精品| 999成人精品视频在线| 亚洲视频在线精品| 国产成人精品福利网站人| 91麻豆精品国产一级| 久久久久se色偷偷亚洲精品av | 国产精品h在线观看| 精品一区二区三区自拍图片区| 久久福利青草精品资源站| 91久久精品91久久性色| 精品无码三级在线观看视频| 亚洲国产精品第一区二区三区| 国产成人亚洲精品91专区高清| 国产精品免费观看久久| 国产精品亚洲专区无码唯爱网 | 久久一区二区三区精品| 久草视频在线这里精品| 国语自产偷拍精品视频偷拍| 久久久精品国产亚洲成人满18免费网站 | 韩国精品一区二区三区无码视频 | 高清在线亚洲精品国产二区| 国产私拍福利精品视频| 国产精品va在线观看无| 国产剧情AV麻豆香蕉精品| 欧洲精品码一区二区三区| 97精品伊人久久大香线蕉|