IntStack(存放int型值,带迭代器) 附模板化实现 p406
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的更多相关文章
- 指针版的PStash(用一个void指针数组, 来保存存入元素的地址) 附模板化实现 p321
由容器PStash的使用者,负责清除容器中的所有指针.所以用户必须记住放到容器中的是什么类型,在取出时,把取出的void指针转换成对应的类型指针,然后 'delete 转换后的对象指针',才能在清除时 ...
- Android移动应用界面的模板化设计
Android没有像苹果开发那样功能强大的界面开发工具,本身 ADT插件提供的界面编辑能力有限,没办法刻画所有的界面情况:Android的界面xml代码可以进行人工修改,而Iphone的全部在图形界面 ...
- ASP.NET:MVC模板化机制
模版化的核心是定制ViewEngine.完整的模板化必须实现3个功能:1.网站的多套模版(razor)支持 2.模版的多样式(style)支持. 3.按需实现模版:没有实现的加载默认模版. 我们除了要 ...
- 项目产品化——Excel数据库模板化导入(java)
Excel导入可能是代码开发中比較常见的功能,一个项目假设有多个地方须要excel导入数据库.那么开发的工作量也将比較大,项目产品化过程中,将这么一个类似的功能进行封装合并也是必要的.封装好的代码仅仅 ...
- Blazor 模板化组件开发指南
翻译自 Waqas Anwar 2021年4月15日的文章 <A Developer's Guide To Blazor Templated Components> [1] 在我之前的一篇 ...
- 导入导出笔记-easyExcel初探(表格导入和模板化导出)
前言 本文使用的EasyExcel Alibaba和EasyPoi Apache技术栈分析 EasyExcel Dependency EasyPoi Dependency 1.需求一:表格化需求导入导 ...
- 利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出
我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的 ...
- 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化
经过前面四个版本号的迭代.我们已经制作了一个从视觉和听觉上都非常舒服的H5微场景应用,没有看过的请戳以下: V1.0--简单页面滑动切换 V2.0--多页切换.透明过渡及交互指示 V3.0--增加lo ...
- 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字
1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...
随机推荐
- Ubuntu查找通过apt命令已安装软件
方法一 apt list --installed 方法二 dpkg -l
- 使用php封装APP接口
php封装APP接口 我们先来介绍Json的封装方法 json_encode函数传递中文的话,输出后是乱码的,针对这个问题我觉得有必要做一个解释: 其实json_encode对中文那不是乱码,只是js ...
- jmeter测试APP时如何录制脚本
jmeter录制脚本需要注意的点: (1)手机和电脑需要处于一个局域网内(如手机和电脑所使用一个wifi) (2)设置手机代理的时候手机IP填写本机IP,端口号要和jmeter的相同,一般情况下端口号 ...
- python 正确地初始化对象
- 洛谷 P3958 奶酪 并查集
目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪 ...
- 跟我一起认识axure(二)
创建企业网站页面步骤 第一步修改这里 变成 第一部分就完成了 第二部分部件窗口 在Axure中设计页面像小时候玩的拼图游戏,那么部件窗口就是专门用来存放拼图块的容器 使用部件窗口中常用的部件设计欢迎页 ...
- Linux下C 更改字符在终端的显示颜色
使用\033[01;04;32;41m之类的配色方案在需要输出显示的文本之前,可以改变应用程序输出文本的颜色或者背景颜色. 比如: #include <stdio.h> int main( ...
- jsp中的标签使用
jsp中的变量作用域 表示变量的作用域,一共4种.pageScope: 表示变量只能在本页面使用.requestScope:表示变量能在本次请求中使用.sessionScope:表示变量能在本次会话 ...
- 反射技术总结 Day25
反射总结 反射的应用场合: 在编译时根本无法知道该对象或类属于那些类, 程序只依靠运行时信息去发现类和对象的真实信息 反射的作用: 通过反射可以使程序代码访问到已经装载到JVM中的类的内部信息(属性 ...
- Docker Swarm:经济高效的容器调度
本文探讨了几种容器调度策略,并以内存约束为例,讨论了如何利用Docker Swarm,通过资源约束实现容器的合理调度.其中,对容器资源的约束,包括硬约束和软约束,硬约束是指内存资源的实际限制条件,而软 ...