C++在stack的deque实现

C++在stack的deque实现



本文实现STL在stack大部分功能,同时加入了许多功能。

请注意以下几点:

1.Stack它是一个适配器,在底部vector、list、deque等实现

2.Stack不含有迭代器

在本例中,我加入了几项功能,包含不同类型stack之间的复制和赋值功能,能够实现诸如Stack<int, vector<int> >和Stack<double, list<double> >之间的复制和赋值,这主要依靠成员函数模板来实现。

为了更方便的实现以上功能,我加入了一个函数:

const_container_reference get_container() const

来获取内部容器的引用。

此外,标准库的stack不检查越界行为,我为stack加入了异常处理,当栈空时,运行pop或者top会抛出异常。这个异常类继承自Exception(见上篇文章),用来标示栈空。

具体代码例如以下:Exception的实现见:借助backtrace和demangle实现异常类Exception

复制代码
#ifndef STACK_HPP_
#define STACK_HPP_

#include "Exception.h"
#include <deque>

//栈空引发的异常
class EmptyStackException : public Exception
{
public:
    EmptyStackException() :Exception("read empty stack") { }
};


template <typename T, typename Container = std::deque<T> >
class Stack
{
public:
    typedef T value_type;
    typedef T& reference;
    typedef const T& const_reference;
    typedef Container container_type; //容器类型
    typedef EmptyStackException exception_type; //异常类型
    typedef typename Container::size_type size_type;
    typedef Container &container_reference; //容器引用
    typedef const Container& const_container_reference;

    Stack() { }

    //不同类型间实现复制
    template <typename T2, typename Container2>
    Stack<T, Container>(const Stack<T2, Container2> &s); 

    //不同类型间进行赋值
    template <typename T2, typename Container2>
    Stack<T, Container> &operator=(const Stack<T2, Container2> &s);

    void push(const value_type &val) { cont_.push_back(val); }
    void pop() 
    { 
        if(cont_.empty())
            throw exception_type();
        cont_.pop_back(); 
    }

    reference top()
    {
        if(cont_.empty())
            throw exception_type();
        return cont_.back();
    } 
    const_reference top() const
    {
        if(cont_.empty())
            throw exception_type();
        return cont_.back();
    }

    bool empty() const { return cont_.empty(); }
    size_type size() const { return cont_.size(); }

    //获取内部容器的引用
    const_container_reference get_container() const
    { return cont_; } 


    friend bool operator==(const Stack &a, const Stack &b)
    {
        return a.cont_ == b.cont_;
    }
    friend bool operator!=(const Stack &a, const Stack &b)
    {
        return a.cont_ != b.cont_;
    }
    friend bool operator<(const Stack &a, const Stack &b)
    {
        return a.cont_ < b.cont_;
    }
    friend bool operator>(const Stack &a, const Stack &b)
    {
        return a.cont_ > b.cont_;
    }
    friend bool operator<=(const Stack &a, const Stack &b)
    {
        return a.cont_ <= b.cont_;
    }
    friend bool operator>=(const Stack &a, const Stack &b)
    {
        return a.cont_ >= b.cont_;
    }

private:
    Container cont_;
};

template <typename T, typename Container>
template <typename T2, typename Container2>
Stack<T, Container>::Stack(const Stack<T2, Container2> &s)
    :cont_(s.get_container().begin(), s.get_container().end())
{

}

template <typename T, typename Container>
template <typename T2, typename Container2>
Stack<T, Container> &Stack<T, Container>::operator=(const Stack<T2, Container2> &s)
{
    if((void*)this != (void*)&s) 
    {
        cont_.assign(s.get_container().begin(), s.get_container().end());
    }
    
    return *this;
}


#endif /* STACK_HPP_ */
复制代码

測试代码例如以下:

复制代码
#include "Stack.hpp"
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <stdio.h>
using namespace std;

int main(int argc, char const *argv[])
{
   
    try
    {
        Stack<string, vector<string> > st;
        st.push("foo");
        st.push("bar");

        Stack<string, list<string> > st2(st);
        //st2 = st;

        while(!st2.empty())
        {
            cout << st2.top() << endl;
            st2.pop();
        }

        st2.pop(); //引发异常
    }
    catch (const Exception& ex)
    {
        fprintf(stderr, "reason: %s\n", ex.what());
        fprintf(stderr, "stack trace: %s\n", ex.stackTrace());
    }

    return 0;
}
复制代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109404.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言中strstr函数怎么实现_c语言strstr函数怎么写

    c语言中strstr函数怎么实现_c语言strstr函数怎么写首先,我们来看strstr函数的使用可见,strstr函数是用来查找字串的一个函数。因为字符串中有“cde”子串,所以代码运行起来结果就是”cdef”。现在,我们已经将strstr函数的作用大概了解了一下,下面开始函数的模拟实现。首先,在cplusplus中搜索strstr可以了解到她返回的类型及参数相关链接:strstr-C++Reference(cplusplus.com)接下来,我们分析实现思路直到s1到了下图的位置,两者相等当*s1==*s2时进入while循环,s1+

    2022年10月9日
    4
  • mysql declare 语法_sql_declare等语法 | 学步园[通俗易懂]

    mysql declare 语法_sql_declare等语法 | 学步园[通俗易懂]===sqlserver:—sqldeclare–简单赋值declare@aintset@a=5select@a–使用select语句赋值declare@user1nvarchar(50)select@user1=’张三’select@user1declare@user2nvarchar(50)select@user2=NamefromST_Userwhe…

    2022年8月20日
    32
  • Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇

    Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇目录环境准备新建项目pom.xml默认内容mysql数据库数据库CRUD全局配置文件默认数据源CRUD数据库PhoneController测试结果自动配置原理DataSourceConfiguration1、《SpringBoot数据库访问简介》中已经介绍,SpringBoot可以通过多种方式访问各种数据库,本文将介绍Spr…

    2022年6月23日
    130
  • 国标 计算机机房,国标相关知识:电子信息系统机房设计规范(GB50174-2008)[通俗易懂]

    国标 计算机机房,国标相关知识:电子信息系统机房设计规范(GB50174-2008)[通俗易懂]1总则1.0.1为规范电子信息系统机房设计,确保电子信息系统安全、稳定、可靠地运行,做到技术先进、经济合理、安全适用、节能环保,制定本规范。1.0.2本规范适用于建筑中新建、改建和扩建的电子信息系统机房的设计。1.0.3电子信息系统机房的设计应遵循近期建设规模与远期发展规划协调一致的原则。1.0.4电子信息系统机房设计除应符合本规范外,尚应符合国家现行有关标准、规范的规定。2术语2.0.1电子信息…

    2022年10月2日
    5
  • 自动化测试之超厉害自动化录制工具介绍

    自动化测试之超厉害自动化录制工具介绍

    2021年9月17日
    152
  • go语言环境搭建_如何搭建语言培训平台

    go语言环境搭建_如何搭建语言培训平台因为项目的原因,要用到go语言,所以自学了一下。要想学习一门语言,首先必须搭建 语言的环境,go也一样,我这边是采用源码安装的。1. 下载安装包,如果觉得翻墙麻烦,可以直接在Golang中国社区下载安装包 http://www.golangtc.com/download2.假设我们在包解压到 /home/work/dev/package/go目录下, 

    2022年10月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号