<sup id="m40ya"></sup>
  • 
    
  • <kbd id="m40ya"></kbd>
    <samp id="m40ya"></samp>
    <ul id="m40ya"></ul>
  • 更多精彩內容,歡迎關注:

    視頻號
    視頻號

    抖音
    抖音

    快手
    快手

    微博
    微博

    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 亚洲精品无码久久| 久久91精品国产91久久小草| 久久精品国产免费观看三人同眠| 国产一区麻豆剧传媒果冻精品 | aaaaaa精品视频在线观看| 国产精品乱码久久久久久软件| 久久99国产综合精品女同| 日韩精品免费视频| 国产精品一区二区三区99| 国产精品成人久久久久| 中文字幕精品一区二区| 久久精品国产亚洲av麻豆小说| 囯产精品久久久久久久久蜜桃| 亚洲国产精品激情在线观看| 精品久久国产视频| 亚洲熟女精品中文字幕| 国产精品久久久久久| 日韩精品中文字幕无码一区| 国产99视频精品免视看9| 国产精品熟女福利久久AV| 这里只有精品视频| 国产精品久久久尹人香蕉| 香蕉久久夜色精品国产| 亚洲国产午夜精品理论片在线播放| 3d动漫精品啪啪一区二区中| 亚洲国产精品国自产电影| 亚洲精品一品区二品区三品区| 精品福利一区二区三区| 亚欧乱色国产精品免费视频| 国产精品嫩草影院线路| 情侣视频精品免费的国产| 国产日产欧产精品精品浪潮| 日韩精品成人无码专区免费| 精品午夜福利无人区乱码一区| 亚洲精品中文字幕乱码影院| 91www永久在线精品果冻传媒| 91在线手机精品免费观看| 91精品久久久久久久久久小网站| 91亚洲国产成人精品下载| 91在线老王精品免费播放| 67194国产精品免费观看|