四、StaticList 和 DynamicList
1、StaticList类模板
StaticList
的设计要点:类模板
- 使用原生数组作为顺序存储空间
- 使用模板参数决定数组大小
template <typename T, int N>
class StaticList : public SeqList<T>
{
protected:
T m_space[N]; // 顺序存储空间,N为模板参数
public:
StaticList() // 指定父类成员的具体值
{
this->m_array = m_space;
this->m_length = 0;
}
int capacity() const
{
return N;
}
};
2、DynamicList类模板
DynamicList
设计要点:类模板
- 申请连续堆空间作为顺序存储空间
- 动态设置顺序存储空间的大小
- 保证重置顺序存储空间时的异常安全性
异常安全性的概念:
- 不泄露任何资源
- 不允许破坏数据
函数异常安全的基本保证:如果异常被抛出
- 对象内的任何成员任然能保持有效状态
- 没有数据的破坏及资源泄漏
DynamicList
类模板:
template <typename T>
class DynamicList : public SeqList<T>
{
protected:
int m_capacity; // 顺序存储空间的大小
public:
DynamicList(int capacity) // 申请空间,构造函数参数作为大小
{
this->m_array = new T[capacity];
if ( this->m_array != NULL)
{
// 堆空间申请成功
this->m_length = 0;
this->m_capacity = capacity;
}
else
{
THROW_EXCEPTION(NoEnoughMemoryException, "No memory to creat DynamicList object...");
}
}
int capacity() const
{
return m_capacity;
}
/* 重新设置顺序存储空间的大小 */
void resize(int capacity)
{
if (capacity != m_capacity)
{
T* array = new T[capacity];
// 为什么不直接操作this->m_array
// 因为要保证数据的完整性,设置了空间大小 ,原来的数据不变
if( array != NULL)
{
int length = (this->m_length < capacity ? this->m_length : capacity);
for (int i = 0; i < length; i++)
{
// 复制数据元素
array[i] = this->m_array[i];
// 这里也可能发生异常,但是也不会怎样,当前的线性表对象不会发生改变,只是array会被泄漏
// 如果这里发生异常,说明泛指类型T所指代的具体类型所导致的,是第三方工程师代码问题
}
// delete this->m_array;
// 没有直接操作this->m_array,是因为有可能在析构的时候会发生异常,函数异常返回,导致this->m_array等没法赋值,这就没法保证当前的线性表this->m_array合法可用
// 思路是先用一个临时指针指向原先的顺序存储空间,然后将线性表赋值,改为重置之后的线性表,然后再delete[] temp,这时就算再发生异常,线性表也是合法可用的
T* temp = this->m_array;
this->m_array = array;
this->m_length = length;
this->m_capacity = capacity;
delete[] temp;
}
else
{
THROW_EXCEPTION(NoEnoughMemoryException, "No memory to resize DynamicList object...");
}
}
}
~DynamicList()
{
delete[] this->m_array;
}
};
3、小结
StaticList
通过模板参数定义顺序存储空间
DynamicList
通过动态内存申请定义顺序存储空间
DynamicList
支持动态重置顺序存储空间的大小
DynamicList
中的resize()
函数实现需要保证异常安全
四、StaticList 和 DynamicList的更多相关文章
- 第十七课 StaticList和DynamicList实现
本节我们要实现StaticList和DynamicList,如下: StaticList的设计要点: StaticList是一个类模板,使用原生数组作为顺序存储空间,使用模板参数决定数组大小 在Sta ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户
阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)
前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
- HTML 事件(四) 模拟事件操作
本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4. ...
随机推荐
- Codeforces Round #422 (Div. 2) C. Hacker, pack your bags!(更新数组)
传送门 题意 给出n个区间[l,r]及花费\(cost_i\),找两个区间满足 1.区间和为指定值x 2.花费最小 分析 先用vector记录(l,r,cost)和(r,l,cost),按l排序,再设 ...
- 黑客攻防技术宝典web实战篇:攻击应用程序逻辑习题
猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 何为强制浏览?可以通过它确定哪些漏洞? 强制浏览包括避开浏览器导航对应用程序功能访问顺序实 ...
- vim normal 模式下L键
vim normal 模式下L键总是到一行的最后一个字符,而不是最后一个字符的下一个字符,这样进入插入模式,就还得往右移动一下,就很费劲? 怎么解决 更新: a键进入插入即可
- the little schemer 笔记(4)
第四章 numbers games 14 是原子吗 是的,数都是原子 (atom? n) 是真还是假,其中n是14 真,14 是原子 -3是数吗 是的,不过我们暂不考虑负数 3.14159是数吗 是的 ...
- Java项目的命名规则
Java类的命名规范如下: 1. 项目名全部小写 2. 包名全部小写 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. 如:public class MyFirstClass{ ...
- zabbix 安装小结
其实很简单的东西,结果折腾了好久.首先去官网 下个source,然后按照文档来 https://www.zabbix.com/documentation/3.2/manual/installation ...
- 18.5.2动态代理和AOP
----此处是JDK动态代理----package d18_5_2; public interface IDog { void info(); void run(); } package d18_5_ ...
- Java 关键字volatile的解释
volatile 关键字特征: 1.可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.可以禁止线程的工作内存对volatile修饰的变量进行缓存,并将修改的变量立即写入主存. 2. ...
- Node.Js的Module System 以及一些常用 Module
Node.Js学习就按照这本书的流程来. 在第7章结束与第10章结束时分别自己出一个小项目练练手.Node.Js的入门学习计划是这样. 目录:, QQ:1045642972 欢迎来索书以及讨论Node ...
- 6 Specialzed layers 特殊层 第二部分 读书笔记
CAGradientLayer CAGradientLayer is used to generate a smooth gradient between two or more colors. ...