C++詳解如何通過模板實(shí)現(xiàn)元素的反序
所涉知識(shí)點(diǎn)
閱讀此文需要掌握的知識(shí)點(diǎn):回調(diào)函數(shù),模板類,類模板,棧。
模板概念
首先模板分為函數(shù)模板和類模板
想到模板,就會(huì)聯(lián)想到泛型編程
泛型編程:編寫與類型無關(guān)的通用代碼,是代碼復(fù)用的一種手段。模板是泛型編程的基礎(chǔ)。
網(wǎng)圖:
在之前,我們已經(jīng)知道了函數(shù)重載
還是那一個(gè)例子 Swap函數(shù)交換 int double char
哪怕是函數(shù)重載,我們也要寫三個(gè),但是如果有了模板,我們只需要:
告訴編譯器一個(gè)模板,讓編譯器根據(jù)不同的類型利用該模板來生成代碼
示例代碼
這里直接上代碼。
#pragma once #include <Stack> using namespace std; typedef void(*PRINTSTACK)(void *); template<typename T> class ReverseArray { public: ReverseArray(); ~ReverseArray(); void pushStack(T data); T getTopStack(); void popStack(); int getSizeStack(); void printStack(void * data, PRINTSTACK print); private: stack<T> m_stack; }; template<typename T> inline ReverseArray<T>::ReverseArray() { } template<typename T> inline ReverseArray<T>::~ReverseArray() { } template<typename T> inline void ReverseArray<T>::pushStack(T data) { m_stack.push(data); } template<typename T> inline T ReverseArray<T>::getTopStack() { return T(m_stack.top()); } template<typename T> inline void ReverseArray<T>::popStack() { m_stack.pop(); } template<typename T> inline int ReverseArray<T>::getSizeStack() { return m_stack.size(); } template<typename T> inline void ReverseArray<T>::printStack(void* data,PRINTSTACK print) { print(data); }
main.cpp
#include <iostream> #include <string> #include "ReverseArray.h" using namespace std; #define CHAR_SIZE 5 #define STRING_SIZE 7 /* 描述:反轉(zhuǎn)數(shù)組(任意類型) */ typedef struct PERSON { int age; char name[64]; }Person; void myPrint(void *data) { Person *p = (Person*)data; cout << "age;" << p->age << " name:" << p->name << endl; } void printString(void * data) { string str = *((string*)data); cout << str << endl; } void printChar(void * data) { char c = *((char*)data); cout << c << endl; } void test() { ReverseArray<Person> *pStack = new ReverseArray<Person>; Person p1 = { 3,"hudf"}; Person p2 = { 5,"akso"}; Person p3 = { 7,"及家屬的" }; Person p4 = { 8,"口袋"}; Person p5 = { 8,"husdh"}; pStack->pushStack(p1); pStack->pushStack(p2); pStack->pushStack(p3); pStack->pushStack(p4); pStack->pushStack(p5); while (pStack->getSizeStack() > 0) { Person data = pStack->getTopStack(); pStack->printStack((void *)&data,myPrint); pStack->popStack();//進(jìn)出棧操作的是棧頂 } cout << "========string array============" << endl; ReverseArray<string> *pStringStack = new ReverseArray<string>; string array[] = { "tyu","hello","start","wei","come","waht","world"}; string newArray[STRING_SIZE]; // cout << array->size() << endl;//這里取第一個(gè)字符串中元素的個(gè)數(shù) for (size_t i = 0; i < STRING_SIZE; ++i) { pStringStack->pushStack(array[i]); } cout << "stack size:" << pStringStack->getSizeStack() << endl; int i = 0; while (pStringStack->getSizeStack() > 0) { string data = pStringStack->getTopStack(); pStringStack->printStack((void *)&data, printString); newArray[i] = data; pStringStack->popStack();//進(jìn)出棧操作的是棧頂 ++i; } cout << "=============print newArray============" << endl; for (int i = 0; i < STRING_SIZE; ++i) { cout << newArray[i]<< " "; } cout << endl; cout << "========char array============" << endl; ReverseArray<char> *pCharStack = new ReverseArray<char>; char charArray[] = {'a','b','c','d','e'}; char newCharArray[CHAR_SIZE]; for (size_t i = 0; i < CHAR_SIZE; ++i) { pCharStack->pushStack(charArray[i]); } cout << "stack size:" << pCharStack->getSizeStack() << endl; int n = 0; while (pCharStack->getSizeStack() > 0) { char data = pCharStack->getTopStack(); pCharStack->printStack((void *)&data, printChar); newCharArray[n] = data; pCharStack->popStack();//進(jìn)出棧操作的是棧頂 ++n; } cout << "=============print newCharArray============" << endl; for (int i = 0; i < CHAR_SIZE; ++i) { cout << newCharArray[i] << " "; } cout << endl; } int main() { test(); return 0; } // 運(yùn)行程序: Ctrl + F5 或調(diào)試 >“開始執(zhí)行(不調(diào)試)”菜單 // 調(diào)試程序: F5 或調(diào)試 >“開始調(diào)試”菜單 // 入門使用技巧: // 1. 使用解決方案資源管理器窗口添加/管理文件 // 2. 使用團(tuán)隊(duì)資源管理器窗口連接到源代碼管理 // 3. 使用輸出窗口查看生成輸出和其他消息 // 4. 使用錯(cuò)誤列表窗口查看錯(cuò)誤 // 5. 轉(zhuǎn)到“項(xiàng)目”>“添加新項(xiàng)”以創(chuàng)建新的代碼文件,或轉(zhuǎn)到“項(xiàng)目”>“添加現(xiàn)有項(xiàng)”以將現(xiàn)有代碼文件添加到項(xiàng)目 // 6. 將來,若要再次打開此項(xiàng)目,請(qǐng)轉(zhuǎn)到“文件”>“打開”>“項(xiàng)目”并選擇 .sln 文件
開發(fā)環(huán)境
vs2017控制臺(tái)輸出程序。
運(yùn)行結(jié)果
注意
類模板的使用需要將類的聲明與定義放在.h文件中,因?yàn)槟0灞旧硎且环N不確定的類型,編譯器在編譯的時(shí)候需要在.h文件中去找模板中相應(yīng)的定義。
到此這篇關(guān)于C++詳解如何通過模板實(shí)現(xiàn)元素的反序的文章就介紹到這了,更多相關(guān)C++元素的反序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言基本排序算法之插入排序與直接選擇排序?qū)崿F(xiàn)方法
這篇文章主要介紹了C語言基本排序算法之插入排序與直接選擇排序?qū)崿F(xiàn)方法,結(jié)合具體實(shí)例形式分析了插入排序與直接選擇排序的定義、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-09-09數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實(shí)例代碼
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法
這篇文章主要為大家詳細(xì)介紹了C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問題
這篇文章主要介紹了C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C/C++?Qt?數(shù)據(jù)庫與TableView實(shí)現(xiàn)多組件聯(lián)動(dòng)
Qt?數(shù)據(jù)庫組件與TableView組件實(shí)現(xiàn)聯(lián)動(dòng)效果,本文通過案例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-12-12C語言數(shù)據(jù)結(jié)構(gòu)系列之樹的概念結(jié)構(gòu)和常見表示方法
本章將正式開啟數(shù)據(jù)結(jié)構(gòu)中?“樹”?部分的講解,本章將介紹樹的概念和結(jié)構(gòu),以及樹的表示方法,感興趣的朋友進(jìn)來看看吧2022-02-02OpenCV3實(shí)現(xiàn)車牌識(shí)別(C++版)
這篇文章主要為大家詳細(xì)介紹了OpenCV3實(shí)現(xiàn)車牌識(shí)別功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++高性能服務(wù)器框架之協(xié)程調(diào)度模塊
這篇文章主要介紹了C++高性能服務(wù)器框架中的協(xié)程調(diào)度模塊,文中通過代碼示例介紹的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06