模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。
您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。
函数模板
template <class type> ret-type func-name(parameter list) { // 函数的主体 }
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
using namespace std;
#if 0
template <typename T>
T const & Max(T const& a, T const& b)
{
return a>b?a:b;
}
#endif
template <class T>
T const & Max(T const& a, T const& b)
{
return a>b?a:b;
}
int main()
{
int i = 89;
int j = 90;
cout << max(i, j) << endl;
return 0;
}
类模板
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <stdexcept>
using namespace std;
template <class T>
class Stack{
private:
vector<T> elems;
public:
void push(T const &);
void pop();
T top() const;
bool empty() const{
return elems.empty();
}
};
template <class T>
void Stack<T>::push(T const & elem)
{
elems.push_back(elem);
}
template <class T>
void Stack<T>::pop()
{
if(elems.empty()){
throw out_of_range("stack <T> elems empty\n");
}
elems.pop_back();
}
template <class T>
T Stack<T>::top() const
{
if(elems.empty()){
throw out_of_range("stack <T> elems empty\n");
}
return elems.back();
}
int main()
{
try{
Stack<int> intstack;
intstack.push(7);
cout << intstack.top() << endl;
Stack<string> strstack;
strstack.push("yuanhui");
cout << strstack.top() << endl;
}
catch(exception const &ex){
cerr << "exception:" << ex.what() << endl;
}
return 0;
}
两个stack构成queue
#include <iostream>
#include <string>
#include <cstdlib>
#include <stack>
#include <stdexcept>
using namespace std;
template <class T>
class CQueue{
public:
void appendTail(const T & node);
T deletedHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template <class T>
void CQueue<T>::appendTail(const T &node)
{
stack1.push(node);
}
template <class T>
T CQueue<T>::deletedHead()
{
while(stack1.size()>0){
const T data = stack1.top();
stack1.pop();
stack2.push(data);
}
if(stack2.size()==0){
throw "Division by zero condition!";
}
const T ret = stack2.top();
stack2.pop();
return ret;
}
int main()
{
CQueue<int> intqueue;
intqueue.appendTail(1);
intqueue.appendTail(2);
intqueue.appendTail(3);
intqueue.appendTail(4);
cout << intqueue.deletedHead() << endl;
cout << intqueue.deletedHead() << endl;
return 0;
}
先将数据放到stack1里面去,然后将stack1中的数据从尾部排出来存放到stack2里面去。
使用两个queue构成stack
#include <iostream>
#include <string>
#include <cstdlib>
#include <queue>
#include <stdexcept>
using namespace std;
template <class T>
class Stack{
public:
void appendTail(const T & node);
T deletedTail();
private:
queue<T> queue1;
queue<T> queue2;
};
template <class T>
void Stack<T>::appendTail(const T &node)
{
queue1.push(node);
}
template <class T>
T Stack<T>::deletedTail()
{
while(queue1.size()>1){
const T data = queue1.front();
queue1.pop();
queue2.push(data);
}
if(queue1.size()==0){
throw "Division by zero condition!";
}
const T ret = queue1.front();
queue1.pop();
// 将queue2的数据扔到queue1中
while(queue2.size()>0){
const T data = queue2.front();
queue2.pop();
queue1.push(data);
}
return ret;
}
int main()
{
Stack<int> intstack;
intstack.appendTail(1);
intstack.appendTail(2);
intstack.appendTail(3);
intstack.appendTail(4);
cout << intstack.deletedTail() << endl;
cout << intstack.deletedTail() << endl;
return 0;
}