每日一题22:Deque与Trait
来源:互联网 发布:mac装好的软件在哪里 编辑:程序博客网 时间:2024/06/17 01:22
虽然之前写过一个Deque,但是那个属于C与C++混合的产品,近来在学习C++模板,所以写了一个C++版,同时第一次尝试使用Trait技术。
本来已经写好的文章,发表之后丢失了,好郁闷,没心情再写了,贴贴代码吧。
这个Trait是用来决定传递参数时是使用值传递还是引用传递
#ifndef _TYPE_TRAITS_H_#define _TYPE_TRAITS_H_namespace MyDataStructure{ template<typename T> class ParameterTrait { private: template<typename U> struct __ParaTrait { typedef U& ParameterType; }; template<typename U> struct __ParaTrait<U*> { typedef U ParameterType; }; template<typename U> struct __ParaTrait<U&> { typedef typename __ParaTrait<U>::ParameterType ParameterType; }; template<> struct __ParaTrait<char> { typedef char ParameterType; }; template<> struct __ParaTrait<unsigned char> { typedef unsigned char ParameterType; }; template<> struct __ParaTrait<int> { typedef int ParameterType; }; template<> struct __ParaTrait<unsigned int> { typedef unsigned int ParameterType; }; public: typedef typename __ParaTrait<T>::ParameterType ParameterType; };}#endif
模板情况下实现的双端队列(其实这个只是双向链表,真正的双端队列比这个复杂太多了):
#ifndef _DEQUE_H_#define _DEQUE_H_#include "..\Utilites\type_traits.h"namespace MyDataStructure{ template<typename T> class BiDirectionNode { private: typedef typename ParameterTrait<T>::ParameterType ParameterType; public: BiDirectionNode(const ParameterType value) : value(value),next(nullptr),pre(nullptr) {} BiDirectionNode(const BiDirectionNode& n) { _copy(n); } BiDirectionNode& operator = (const BiDirectionNode& n) { _copy(n); return *this; } T Value() const { return value; } T& Value() { return value; } T* Next() { return next; } public: void _copy(const BiDirectionNode& n) { value = n.value; next = n.next; pre = n.pre; } T value; BiDirectionNode* pre; BiDirectionNode* next; }; template<typename T> class Deque { private: typedef typename BiDirectionNode<T> NodeType; typedef typename ParameterTrait<T>::ParameterType ParameterType; public: Deque() : size(0), head(nullptr),tail(nullptr){} Deque(const Deque& d){ _copy(d); } Deque& operator=(const Deque& d){ _destroy(); _copy(d); return *this; } ~Deque(){ _destroy(); } void Clear() { _destroy(); } const int Size() { return size; } bool Empty(){ return size == 0; } void Push(const ParameterType value) { NodeType* n = new NodeType(value); _push(n); } void Insert(const ParameterType value) { NodeType* n = new NodeType(value); _insert(n); } bool Pop(T& value) { if (size == 0) return false; value = head->value; NodeType* p = head; if (size == 1) { head = tail = nullptr; } else { head = head->next; head->pre = nullptr; } --size; delete p; return true; } bool Eject(T& value) { if (size == 0) return false; value = tail->value; NodeType* p = tail; if (size == 1) { head = tail = nullptr; } else { tail = tail->pre; tail->next = nullptr; } --size; delete p; return true; } private: void _push( NodeType* n) { if (size == 0) { head = n; head->next = nullptr; head->pre = nullptr; tail = head; } else { n->next = head; n->pre = nullptr; head->pre = n; head = n; } ++size; } void _insert( NodeType* n) { if (size == 0) { head = n; head->next = nullptr; head->pre = nullptr; tail = head; } else { tail->next = n; n->pre = tail; n->next = nullptr; tail = n; } ++size; } void _copy(const Deque& d) { NodeType* node = d.head; while (node) { NodeType* newNode = new NodeType(*node); _insert(newNode); node = node->next; } } void _destroy() { NodeType* node = head; while (node) { NodeType* p = node->next; delete node; node = p; } head = tail = nullptr; size = 0; } private: int size; NodeType* head; NodeType* tail; };}#endif
测试代码:
// Deque.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Deque.h"#include <iostream>#include <deque>using namespace std;using namespace MyDataStructure;int _tmain(int argc, _TCHAR* argv[]){ Deque<int> d; for (int i = 0; i < 10; ++i) { d.Insert(i); } Deque<int> d2; Deque<int> d1 = d2 = d; int value; for (int i = 0; i < 10; ++i) { if (d1.Eject(value)) cout << value << ' '; } cout << endl; for (int i = 0; i < 10; ++i) { if (d2.Eject(value)) cout << value << ' '; } cout << endl; for (int i = 0; i < 10; ++i) { if (d.Eject(value)) cout << value << ' '; } cout << endl; cout << d.Size() << endl; d.Clear(); d1.Clear(); d2.Clear(); return 0;}
运行结果:
本次写博客的经验是:1)以后注释直接写在源文件里,不要到了写博客的时候才写在博文里。2)如果你是写了一半保存在线上,下次写完发表时,请先保存一下再发表,不然如果马上再来修改已经发表的文章的时候,只有之前的一半内容。已被坑死!
0 0
- 每日一题22:Deque与Trait
- 每日一题(63) - 排列与组合
- 栈与队列【每日一题】
- Scala Trait(一)
- 每日一题#10-22 Ransomware
- 【每日一题(22)】Hamburgers Codeforces Round
- 每日一练22
- 每日一题2
- 每日一题
- 每日一题12.20
- 每日一题
- Javascript每日一题
- 每日一题
- Mysql每日一题
- 每日一题-1
- 每日一题
- 每日一题A
- 每日一题A
- Zabbix的学习过程--zabbix客户端
- XproerIM V2开源,基于XproerUI界面库构架
- Architecture 学习初步
- 在 Tomcat 中部署 Java Web 程序 ( jar cvf *.war */. ) war 包
- Paraview Parallel模式下的文件解析(一)
- 每日一题22:Deque与Trait
- yii2 一个开源demo
- composer 在windows下安装
- NetBIOS网络编程
- 了解Session
- page指令属性
- 项目开发-iBatis事务源码之事务提交和回滚
- 数据库访问抽象层系列-1(介绍数据库编程接口及数据库访问抽象层概念)
- linux 源码Makefile 详细分析