实现stack 和queue--模板类、容器适配器

实现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;
};




阅读更多
个人分类: C++ 数据结构
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭