博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ primer 模板与泛型编程
阅读量:6150 次
发布时间:2019-06-21

本文共 2512 字,大约阅读时间需要 8 分钟。

继续浏览c++ primer 看到模板与泛型编程这章。就顺便把这几节的代码综合了下,对一个Queue队列模板的实现

贴一下代码(看完书。自己敲,忘记了哪再看下书)

#include 
using std::ostream;//声明Queue的模板类template
class Queue;//声明模板函数template
ostream& operator<<(ostream& , const Queue
&);//定义QueueItem的模板类template
class QueueItem{ //定义友元模板类和友元模板函数 friend class Queue
; friend ostream& operator<<
(ostream& , const Queue
&); //QueueItem构造函数 QueueItem(const Type &t):item(t),next(0){} QueueItem *next; Type item;};//定义Queue模板类template
class Queue{ //定义友元模板函数 friend ostream& operator<<
(ostream& , const Queue
&);public: //构造函数 Queue():head(0),tail(0){} template
Queue(It beg, It end):head(0),tail(0){copy_elems(beg,end);} template
void assign(Iter , Iter); //复制构造函数 Queue(const Queue &object){head(0);tail(0);copy_elems(object);} //赋值操作符 Queue& operator=(const Queue&); //析构函数 ~Queue(){destroy();} //push操作 void push(const Type&); //pop操作 void pop(); //取队列头元素的操作front Type& front(); //推断是否为空的操作 bool empty(){return head==0;}private: QueueItem *head; QueueItem *tail; void destroy(); void copy_elems(const Queue&); template
void copy_elems(Iter , Iter);};//重载输出操作符template
ostream& operator<<(ostream &os , const Queue
&object){ os << "<"; QueueItem *p; for(p=object.head;p!=object.tail;p=p->next) { os <
item << " "; } os << ">" << endl;}//定义Queue模板类中的模板成员函数template
template
void Queue
::assign(Iter beg, Iter end){ destroy(); copy_elems(beg , end);}//定义Queue模板类中的copy_elems模板成员函数template
template
void Queue
::copy_elems(Iter beg, Iter end){ while(beg != end) { push(*beg); ++beg; }}//Queue模板类中的copy_elems成员函数template
void Queue
::copy_elems(const Queue &object){ QueueItem
*p; for(p=object.head;p&&p!=object.tail;p=p->next) { push(p->item); }}//赋值操作符template
Queue
& Queue
::operator=(const Queue &rhs){ if(&rhs != this) { destroy(); copy_elems(rhs); } return *this;}/*//第二种用链表直接实现赋值操作符template
Queue
& Queue
::operator=(const Queue &rhs){ QueueItem
*p = rhs.head; while(p) { QueueItem
*q = new QueueItem
(p->item); if(p == rhs.head) { head = tail = q; }else{ tail->next = q; tail = q; p=p->next; } } return *this;}*///push操作template
void Queue
::push(const Type &value){ QueueItem
*p = new QueueItem
(value); if(this->empty()) { head = p; tail = p; }else{ tail->next = p; tail = p; }}//pop操作template
void Queue
::pop(){ QueueItem
*p; p=head; head = head->next; delete p;}//front操作template
Type& Queue
::front(){ return head->item;}//destory操作template
void Queue
::destroy(){ while(!empty()) { pop(); }}

转载地址:http://lfmya.baihongyu.com/

你可能感兴趣的文章
linux监控cacti配置教程(6)
查看>>
jvm 内存分配
查看>>
从Storm和Spark 学习流式实时分布式计算的设计
查看>>
各大银行的收发标准
查看>>
Spring Cloud Finchley 正式发布,包含 4 个重大更新!
查看>>
Nginx + Tomcat + HTTPS 配置原来不需要在 Tomcat 上启用 SSL 支持
查看>>
我的友情链接
查看>>
应用多级缓存模式支撑海量读服务
查看>>
spring boot @ConditionalOnxxx相关注解总结
查看>>
Mysql内存参数优化
查看>>
通配符的匹配很全面, 但无法找到元素 'xxxx'
查看>>
我收集的IT集成界的国标。
查看>>
系统集成资质培训 - 挣值分析难点题目解析
查看>>
CentOS6 图形界面(gnome)安装
查看>>
myeclipse或者eclipse中建立的web项目下面出现了.classpath、.mymedata、.project处理方式...
查看>>
关于grep正则表达式-1
查看>>
10.15 iptables filter表案例 10.16/10.17/10.18 iptable
查看>>
quota&automount 笔记@2
查看>>
LeetCode:Pow(x, n) - 求指定数字x的整数次幂
查看>>
android混淆代码bug跟踪
查看>>