模板是泛型编程的基础。
所谓泛型编程就是编写与类型⽆关的逻辑代码,是⼀种复⽤的⽅式。
模板分为模板函数和模板类。
函数模板格式:
template <class 形参名1, class 形参名2, class 形参名n>
返回类型 函数名(参数列表)
{
...
}
模板形参的定义既可以使⽤class,也可以使⽤typename,含义是相同的。
注:模板未实例化时,代码内部的语法错误检测不到。
双向循环链表
链表分为有头结点和无头结点,单向和双向,循环和不循环
这里实现一个有头结点的双向循环链表
#include<iostream>
#include<windows.h>
#include<assert.h>
using namespace std;
template<class T>
struct ListNode
{
T _data;
ListNode<T>* _next;
ListNode<T>* _prev;
ListNode(const T& x=T())
:_data(x)
, _next(NULL)
, _prev(NULL)
{}
};
template<class T>
class List
{
typedef ListNode<T> Node;
public:
List()
{
_head = new Node;
_head->_prev = _head;
_head->_next = _head;
}
//传统写法
List(const List<T> &l)
{
_head = new Node(T());
_head->_next = _head;
_head->_