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. WPF DrawingVisual详解

    在WPF中,如果需要绘制大量图形元素,并且对性能要求严苛的话,最好使用DrawingVisual,当然,你也可以选用 Path类和比Path类更轻量级的Geometry(几何形状)来实现你的需求,但是 ...

  2. ls command not found

    编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别. 在命令行下打入下面这段就可以了 export PATH=/usr/local/sbin:/usr/local/bin:/sbi ...

  3. LintCode 斐波纳契数列

    查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3 ...

  4. SQLServer —— 视图

    一.视图的概念 是存储在服务器端的一个查询块,是一张虚拟表. 表示一张表的部分数据或多张表的综合数据. 其结构和数据是建立在对表的查询基础上. 视图的使用,跟对普通的表的查询使用完全一样. 二.视图中 ...

  5. 解决Apache日志"internal dummy connection"方法

    最近查看服务器中apache日志,发现有大量的 OPTIONS * HTTP/1.0" 200 - "-" "Apache (internal dummy co ...

  6. 在Eclipse中添加Tomcat

    在Eclipse中开发web或开启web服务需要Tomcat的支持,在添加Tomcat之前要清楚你的Eclipse版本,如果你的Eclipse是javvEE版的就可以直接安装Tomcat,如果不是就需 ...

  7. java读取项目路径下的中文文件乱码问题

    出现乱码错误: 处理方案: 对文件路径中存在中文的,都要进行URLDecoder.decode(path,"UTF-8")编码转换 wordContent = URLEncoder ...

  8. 2015全球商业地产商影响力排行TOP10:中国占据5个

    2015全球商业地产商影响力排行TOP10:中国占据5个 1.西蒙丨依然最有影响力 发展概况:西蒙公司是北美商业地产(专题阅读)的王者,美最大商业地产REITS,1960年最初只以开发为主,1993年 ...

  9. 2019-9-2-win10-uwp-随着数字变化颜色控件

    title author date CreateTime categories win10 uwp 随着数字变化颜色控件 lindexi 2019-09-02 12:57:38 +0800 2018- ...

  10. jQuery 鼠标移入图片 显示大图并跟随鼠标移动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...