实现stack:
在实现栈的时候,我们都是在顺序表上的特定位置插入删除数据,那么在学习了模板类和容器适配器的概念后,就可以很容易的实现栈了。
关于模板:https://blog.csdn.net/weixin_40417029/article/details/80345464
//stack #pragma once #include <iostream> #include "./vector.h" #include "vector.cpp" //为什么要包含vector.cpp文件呢? using namespace std; template <class T, class Container=Vector<T> > class Stack { public: void Push(T x) { _con.PushBack(x); return; } void Pop() { _con.PopBack(); return; } const T& Top() { return _con.Back(); } int Empty() { return _con.Size() == 0 ? 1 : 0; } protected: Container _con; };
上面是我利用vector类实现的stack类,我为什么要在该文件中包含vector.cpp文件呢?
答:因为我的Vector类(https://blog.csdn.net/weixin_40417029/article/details/80351865)的函数定义与声明是分离的。在构建时会出现“error LNK2019: 无法解析的外部符号 ”的错误。在Linux操作系统下会出现下面的错误:
要解决这样的问题,除了我使用的方法外,还可以使用:
- 第一种方法,就是把类模板中成员函数的声明和定义都放在类的定义中(.h文件),不要分开就行。
- 第二种方法,在主文件(main文件)中既包含类模板的声明文件(接口文件)(.h文件),同时也包含类模板的实现文件(.cpp文件)就行了。
- 第三种方法,在类的定义中(.h文件)的最后包含类模板的实现文件(.cpp文件)。
原因在于模板类和模板函数在使用的时候才会被实例化。当模板被使用时,编译器需要函数所有的实现代码,来用合适的类型(模板参数)去构建正确的函数。但是如果将函数实现在单独的源文件中,这些文件是不可见的,因而会出错。
实现queue:
同样的实现队列也要这样做:
//queue #pragma once #include "List.h" #include "List.cpp" template<class T, class Container=List<T> > class Queue { public: void Push(T x) { _con.PushBack(x); } void Pop() { _con.PopFront(); } int Size() { _con.Size(); } T& Front() { return _con.Front() -> _data; } protected: Container _con; };