模板函数笔记

作者:Rem ㅤ | 发布时间:

序言

在写链表的时候想要使用模板函数,在这个过程中却遇到了问题。

在参考书中链表的节点是使用结构体定义的,但是使用结构体就没办法使用模板,只能在代码编写的时候就确定好数据类型,但是这样并不利于代码的普适性,于是我想使用模板类的方法定义节点,同时对类名进行重命名操作,通过重命名可以增强代码的阅读性。第一次尝试重命名+模板函数的操作,过程查阅了一些博客最终才成功实现,在此做一下记录。

节点类

 template <class T>
 class LNode //单链表节点
 {
 public:
     T data;                                   //数据域
     struct LNode *next;                       //指针域
     LNode(T data) : data(data), next(NULL) {} //有参构造
     LNode() : next(NULL) {}                   //无参构造
 };

在使用有参数的构造函数时最好显示的创建一个无参数的构造函数,否则在创建无初始值的类变量时会提示找不到对应的构造函数。

重命名

在此使用具有c++特点的using语句进行重命名:

 template <class T>
 using LNode = LNode<T>; //起别名
 template <class T>
 using LinkList = LNode<T> *; //起别名

在重命名的时候依然要注明模板。

在此我尝试使用define但是报错:

 template <class T>
 #define LNode LNode<T>
 
 template <class T>
 #define Linklist Lnode<T> *

没有对此细究。

头插法创建带有头指针的链表

 template <class T>
 LinkList<T> List_HeadInsert(LinkList<T> &head, int n) //带头结点的头插法创建链表,n为数据数量
 {
     head = new LNode<T>; //头节点
     head->next = NULL;   //后继节点置空
     T data;              //数据
     for (int i = 0; i < n; i++)
    {
         cin >> data;                      //读取输入
         LNode<T> *s = new LNode<T>(data); //创建新的节点
         s->next = head->next;             //插入到头部
         head->next = s;                   //数据
    }
     return head; //返回头节点
 }

函数返回值类型为LinkList<T>,在创建类变量的时候用类型名为LNode<T>.

auto返回

在查看别人的博客的时候发现函数的返回类型可以时auto,对此做了一个简单的测试:

 #include <iostream>
 using namespace std;
 #define c 10
 template <class T>
 class Test
 {
 public:
     T a;
 };
 template <class T>
 using t = Test<T>;
 
 template <class T>
 auto test(T a, int b)
 {
     return a;
     //return b;
 }
 
 int main()
 {
     Test<int> t;
     cout << test<int>(c, 5) << endl;
     system("pause");
     return 0;
 }

test()函数中返回a或者b都可以成功:

image-20220730142521838

或者:

image-20220730142555227

标签:学习笔记, c/c++