C++詳解如何通過模板實現元素的反序
所涉知識點
閱讀此文需要掌握的知識點:回調函數,模板類,類模板,棧。
模板概念
首先模板分為函數模板和類模板
想到模板,就會聯想到泛型編程
泛型編程:編寫與類型無關的通用代碼,是代碼復用的一種手段。模板是泛型編程的基礎。
網圖:
在之前,我們已經知道瞭函數重載
還是那一個例子 Swap函數交換 int double char
哪怕是函數重載,我們也要寫三個,但是如果有瞭模板,我們隻需要:
告訴編譯器一個模板,讓編譯器根據不同的類型利用該模板來生成代碼
示例代碼
這裡直接上代碼。
#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 /* 描述:反轉數組(任意類型) */ 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();//進出棧操作的是棧頂 } 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;//這裡取第一個字符串中元素的個數 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();//進出棧操作的是棧頂 ++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();//進出棧操作的是棧頂 ++n; } cout << "=============print newCharArray============" << endl; for (int i = 0; i < CHAR_SIZE; ++i) { cout << newCharArray[i] << " "; } cout << endl; } int main() { test(); return 0; } // 運行程序: Ctrl + F5 或調試 >“開始執行(不調試)”菜單 // 調試程序: F5 或調試 >“開始調試”菜單 // 入門使用技巧: // 1. 使用解決方案資源管理器窗口添加/管理文件 // 2. 使用團隊資源管理器窗口連接到源代碼管理 // 3. 使用輸出窗口查看生成輸出和其他消息 // 4. 使用錯誤列表窗口查看錯誤 // 5. 轉到“項目”>“添加新項”以創建新的代碼文件,或轉到“項目”>“添加現有項”以將現有代碼文件添加到項目 // 6. 將來,若要再次打開此項目,請轉到“文件”>“打開”>“項目”並選擇 .sln 文件
開發環境
vs2017控制臺輸出程序。
運行結果
註意
類模板的使用需要將類的聲明與定義放在.h文件中,因為模板本身是一種不確定的類型,編譯器在編譯的時候需要在.h文件中去找模板中相應的定義。
到此這篇關於C++詳解如何通過模板實現元素的反序的文章就介紹到這瞭,更多相關C++元素的反序內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!