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的更多相关文章

  1. 第十七课 StaticList和DynamicList实现

    本节我们要实现StaticList和DynamicList,如下: StaticList的设计要点: StaticList是一个类模板,使用原生数组作为顺序存储空间,使用模板参数决定数组大小 在Sta ...

  2. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  3. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  4. 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户

    阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...

  5. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  6. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  7. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

  8. 【翻译】MongoDB指南/CRUD操作(四)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...

  9. HTML 事件(四) 模拟事件操作

    本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4.  ...

随机推荐

  1. 黑客攻防技术宝典web实战篇:攻击访问控制习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 一个应用程序可能通过使用 HTTP Referer 消息头实施访问控制,但它的正常行为并没 ...

  2. gcc降版本方法 - [学习]

    [转载]转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.com/huangw10-logs/182474992.html 周末折腾了一下午加一夜,终于弄明白 ...

  3. poj3417 闇の連鎖 【树上差分】By cellur925

    闇の連鎖(yam.pas/c/cpp)题目描述传说中的暗之连锁被人们称为 Dark.Dark 是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它.经过研究,你发现 Dark 呈现无向图的结构,图中有 ...

  4. 使用Spring MVC的@RequestBody注解接收Json对象字符串

    最近公司在开发移动APP,APP上通过jQuery提交表单的json字符串格式数据到Java后端,之前通过request手动接收,非常麻烦,其实Spring MVC已经为我们提供了一个注解@Reque ...

  5. hdu3938 Portal 离线+并查集

    #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int ...

  6. safari 日期显示NAN

    解决方案: 1.服务器端将时间转换为时间戳,前端再进行处理,问题解决. fastjson,JSON.toJSONString() 自动将时间字段转换为时间戳类型,然后传到前端. @RequestMap ...

  7. 跟我一起玩Win32开发(7):多边形窗口

    通常情况下,窗口都是一个矩形,不过,调用下面这个函数,可以自定义窗口的形状. int SetWindowRgn( __in  HWND hWnd, __in  HRGN hRgn, __in  BOO ...

  8. MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)

    一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它 ...

  9. fgetcsv()函数

    fgetcsv()函数.fgetcsv()函数可以读取指定文件的当前行,使用CSV格式解析出字段,并返回一个包含这些字段的数组.语法格式如下:array fgetcsv(resource $handl ...

  10. 极其强大的运维工具——pscp、pssh、pslurp

    1.pscp 用于将本地文件复制到远程主机 pscp -h xxx.host 本地文件 远程目录 //xxx.host是所有目的IP的文件,一个IP一行 2.pssh 在远程机器上执行命令 pssh ...