1 该栈只用于存在int型数据

 #include "../require.h"
#include <iostream> using namespace std; class IntStack
{
enum { ssize = };
int stack[ssize];
int top; public:
IntStack() : top() {}
void push(int i)
{
require(top < ssize, "Too many push()es");
stack[top++] = i; //int型元素,通过赋值运算符,直接存入IntStack栈内部的 int stack[]数组中
} int pop()
{
require(top > , "Too many pop()s");
return stack[--top];
} class iterator;
friend class iterator; class iterator
{
IntStack& intStack;
int index; public: iterator(IntStack& is) : intStack(is), index() {} iterator(IntStack& is, bool) : intStack(is), index(is.top) {} // 返回迭代器当前位置的元素
int current() const
{
return intStack.stack[index];
} // ++i
int operator++()
{
require(index < intStack.top, "iterator moved out of range");
return intStack.stack[++index];
} // i++
int operator++(int)
{
require(index < intStack.top, "iterator moved out of range");
return intStack.stack[index++];
} // i += 2;
iterator& operator+=(int amount)
{
require(index + amount < intStack.top, "IntStack::iterator::operator+=() tried to moved out of bounds");
index += amount;
return *this;
} bool operator==(const iterator& rv) const
{
return index == rv.index;
} bool operator!=(const iterator& rv) const
{
return index != rv.index;
} friend ostream& operator<<(ostream& os, const iterator& it);
}; iterator begin()
{
return iterator(*this);
} iterator end()
{
return iterator(*this, true);
}
}; // 重载 << 运算符 -- 全局的
ostream& operator<<(ostream& os, const IntStack::iterator& it)
{
return os << it.current();
} int main()
{
IntStack stack;
for (int i = ; i < ; i++)
{
stack.push(i*);
} //----------------------
cout << "Traverse the whole IntStack" << endl; IntStack::iterator it = stack.begin();
int n=;
while (it != stack.end())
{
cout << n++ << ": " << it++ << endl;
} //----------------------------------
cout << "Traverse a portion of the IntStack" << endl; IntStack::iterator start = stack.begin(), end2 = stack.end();
start += ;
end2 += ; //在此,程序退出 cout << "start = " << start << endl;
cout << "end = " << end2 << endl; while (start != end2)
{
cout << start++ << endl;
} return ;
};

运行结果:

----------------------------------------

附模板化实现(cp406):

容器中放的是值对象,通过重载后的=运算符完成对象数据成员的拷贝(只做了这一层,算是浅拷贝)

StackTemplate.h

 #ifndef STACKTEMPLATE_H
#define STACKTEMPLATE_H template<class T>
class StackTemplate
{
enum { ssize = }; T stack[ssize];
int top; public:
StackTemplate() : top() {} void push(const T& i)
{
stack[top++] = i;
} T pop()
{
return stack[--top];
} int size()
{
return top;
}
};
#endif

测试文件

 #include "fibonacci.h"
#include "StackTemplate.h"
#include <iostream>
#include <fstream>
#include <string>
#include "Book.h" using namespace std; int main()
{ cout << "---------- StackTemplate<int> ------------------" << endl;
StackTemplate<int> intTempl;
for (int i = ; i < ; i++)
{
intTempl.push(fibonacci(i));
}
for (int k = ; k < ; k++)
{
cout << intTempl.pop() << endl;
} cout << "---------- StackTemplate<string> ------------------" << endl; StackTemplate<string> stringTempl;
ifstream in("fibonacci.h");
string line; while (getline(in, line))
stringTempl.push(line); while (stringTempl.size() > )
cout << stringTempl.pop() << endl; cout << "---------- StackTemplate<Book> ------------------" << endl;
{
StackTemplate<Book> books; Book bk1("算法精解", "Kyle Loudon", 56.2);
Book bk2("Qt程序设计", "Pulat", 10.2); books.push(bk1);
books.push(bk2); } return ;
}

运行结果:

从运行结果可以看出,Book bk1("算法精解", "Kyle Loudon", 56.2);拷贝给了books.stack[0](地址,0018fc2c); Book bk2("Qt程序设计", "Pulat", 10.2);拷贝给了books.stack[1](地址,0018fc54)

从调用Book类析构函数的顺序上看,bk2 --> bk1 --> books(books.stack[9] --> books.stack[8] ...... --> books.stack[1] --> books.stack[0])

因为push参数是 const T& i使用的是引用(引用传递),所有元素入栈时没有产生新的Book对象。StackTemplate<Book>完全拥有Book对象,所以超出其作用域后,能够自动析构Book对象。

IntStack(存放int型值,带迭代器) 附模板化实现 p406的更多相关文章

  1. 指针版的PStash(用一个void指针数组, 来保存存入元素的地址) 附模板化实现 p321

    由容器PStash的使用者,负责清除容器中的所有指针.所以用户必须记住放到容器中的是什么类型,在取出时,把取出的void指针转换成对应的类型指针,然后 'delete 转换后的对象指针',才能在清除时 ...

  2. Android移动应用界面的模板化设计

    Android没有像苹果开发那样功能强大的界面开发工具,本身 ADT插件提供的界面编辑能力有限,没办法刻画所有的界面情况:Android的界面xml代码可以进行人工修改,而Iphone的全部在图形界面 ...

  3. ASP.NET:MVC模板化机制

    模版化的核心是定制ViewEngine.完整的模板化必须实现3个功能:1.网站的多套模版(razor)支持 2.模版的多样式(style)支持. 3.按需实现模版:没有实现的加载默认模版. 我们除了要 ...

  4. 项目产品化——Excel数据库模板化导入(java)

    Excel导入可能是代码开发中比較常见的功能,一个项目假设有多个地方须要excel导入数据库.那么开发的工作量也将比較大,项目产品化过程中,将这么一个类似的功能进行封装合并也是必要的.封装好的代码仅仅 ...

  5. Blazor 模板化组件开发指南

    翻译自 Waqas Anwar 2021年4月15日的文章 <A Developer's Guide To Blazor Templated Components> [1] 在我之前的一篇 ...

  6. 导入导出笔记-easyExcel初探(表格导入和模板化导出)

    前言 本文使用的EasyExcel Alibaba和EasyPoi Apache技术栈分析 EasyExcel Dependency EasyPoi Dependency 1.需求一:表格化需求导入导 ...

  7. 利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出

    我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的 ...

  8. 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化

    经过前面四个版本号的迭代.我们已经制作了一个从视觉和听觉上都非常舒服的H5微场景应用,没有看过的请戳以下: V1.0--简单页面滑动切换 V2.0--多页切换.透明过渡及交互指示 V3.0--增加lo ...

  9. 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字

    1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...

随机推荐

  1. linux开发脚本自动部署及监控

    linux开发脚本自动部署及监控 开发脚本自动部署及监控一.编写脚本自动部署反向代理.web.nfs:要求:1.部署nginx反向代理三个web服务,调度算法使用加权轮询: #!/bin/sh ngx ...

  2. Python学习笔记(一)初识Python以及安装Python

    一.Python简介 1.Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的. Python 本身也是由诸多 ...

  3. DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER

    原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

  4. 2019-1-17-一段能让-VisualStudio-炸掉的代码

    title author date CreateTime categories 一段能让 VisualStudio 炸掉的代码 lindexi 2019-01-17 09:55:29 +0800 20 ...

  5. php中实现多线程的的两个方法具体是怎样?

    假设你要建立一个服务来检查正在运行的n台服务器,以确定他们还在正常运转.你可能会写下面这样的代码:代码如下: <?php$hosts = array("host1.sample.com ...

  6. ubuntu下C操作Mysql数据库第一步

    学习于: http://armsword.com/2013/06/20/ubuntu-c-mysql.html

  7. mysql存储过程小解

    mysql 存储过程 1.创建语法 delimiter $$ --$$表示改变默认的分隔符,代表以下为存储过程,不然会以SQL的方式执行 drop procedure if exists pro_na ...

  8. 【JZOJ3886】【长郡NOIP2014模拟10.22】道路维护

    CCC 最近徆多人投诉说C国的道路破损程度太大,以至亍无法通行 C国的政府徆重视这件事,但是最近财政有点紧,丌可能将所有的道路都进行维护,所以他们决定按照下述方案进行维护 将C国抽象成一个无向图,定义 ...

  9. SpringBoot 异步 定时任务 邮件

    springboot异步 一: 在 MyConfiguration.java 中开启注解 @Configuration//指明当前类是一个配置类:就是来替代之前的Spring配置文件@EnableAs ...

  10. Spring-data-jpa时间按照between and 查询

    需求:根据一个String类型的year,要求查询出该年的所有记录: 比如根据2018年查询出2018年01月01日到2018年12月31日之间的记录: public List<Rain> ...