使用类模板的C++线性表实现(数组方式)
main.h
#ifndef _MAIN_H_
#define _MAIN_H_ #include <iostream>
#include <exception>
#include <algorithm> using namespace std; //用于改变一维数组的长度
template<class T>
void changeLength1D(T* a,int oldlength,int newlength)
{
if (newlength > 0)
{
T* extraBlocks = new T[newlength]; //用新长度先分配一块额外空间
int copylen = min(oldlength, newlength); //确认要拷贝的长度
copy(a, a + copylen, extraBlocks); //老数组的数据拷贝到新分配的空间
delete []a; //删除老数组的指针
a = extraBlocks; //指针指向新区域
}
else
{
throw 2;
} } //抽象基类
template<class T>
class LinearList
{
public:
virtual ~LinearList() {};
virtual bool empty() const = 0;
virtual T& get(int index) const = 0;
virtual int indexof(const T& element) const = 0;
virtual void erase(int index) const = 0;
virtual void insert(const int index, const T& element) = 0;
virtual void output() const = 0; }; //数组类定义
template<class T>
class arraylist : LinearList<T>
{
public:
arraylist(int initialCapacity = 10);
arraylist(const arraylist<T>&);
~arraylist() { delete[]element; }
bool empty() const { return listSize == 0; }
int size() const{ return listSize; }
T& get(int index) const;
int indexof(const T& element) const;
void erase(int index) const;
void insert(const int index, const T& element);
void output() const; //新定义的方法
int capacity()const { return arrayLength; } protected:
void checkIndex(int index)const;
T* element;
int arrayLength;
int listSize;
}; //数组类实现
template<class T>
arraylist<T>::arraylist(int initialCapacity) //默认构造函数,初始容量默认值为10
{
if (initialCapacity < 1)
{
throw 0; //抛出的异常用整形数字处理
}
else
{
//do nothing
} arrayLength = initialCapacity;
element = new T[arrayLength]; //分配数组空间
listSize = 0;
} template<class T>
arraylist<T>::arraylist(const arraylist<T>& theList) //复制构造函数
{
arrayLength = theList.arrayLength;
listSize = theList.listSize;
element = new T[arrayLength];
copy(theList.element, theList.element + listSize, element);
} template<class T>
void arraylist<T>::checkIndex(int index)const //检查下标
{
if (index < 0 || index >= listSize)
{
throw 1;
}
else
{
//do nothing
}
} template<class T>
T& arraylist<T>::get(int index) const //获取某下标的元素
{
checkIndex(index);
return element[index];
} template<class T>
int arraylist<T>::indexof(const T& theElement) const //获取某元素的下标
{
int foundindex = (int)(find(element, element + listSize, theElement) - element); if (foundindex == listSize)
return -1;
else return foundindex;
} template<class T>
void arraylist<T>::erase(int index) const
{
checkIndex(index); //从index+1开始,所有元素左移一格
copy(element + index + 1, element + listSize, element + index); int sizeTemp = listSize;
sizeTemp--;
element[--sizeTemp].~T(); //调用析构函数删除元素 } template<class T>
void arraylist<T>::insert(const int index, const T& theElement) //特定位置插入元素
{
if (index < 0 || index > listSize)
{
throw 1;
}
else
{
//do nothing
} //数组长度达到容量,容量加倍
if (listSize == arrayLength)
{
changeLength1D(element, arrayLength, 2 * arrayLength);
arrayLength *= 2;
}
else
{
//do nothing
} copy_backward(element + index, element + listSize, element + listSize + 1);
element[index] = theElement;
listSize++;
} template<class T>
void arraylist<T>::output() const
{
for (int i = 0; i < listSize; i++)
{
cout << element[i] << " ";
}
cout << endl;
} #endif
main.cpp
#include "main.h" int main()
{
arraylist<int> a1; try
{
a1.insert(0, 1);
a1.insert(1, 2);
a1.insert(2, 3); a1.output(); a1.insert(0, 4); a1.output();
}
catch (const int errornum)
{
if (errornum == 0)
{
cout << "Initial capacity must be >0!\n";
}
else if (errornum == 1)
{
cout << "Array index illegal!\n";
}
else if(errornum == 2)
{
cout << "New array length must be >0!\n";
}
} return 0;
}
使用类模板的C++线性表实现(数组方式)的更多相关文章
- 线性表实现简单vector
实现一个简单的vector Vector基于数组实现,可以复制并且其占用的内存可以自动回收(通过析构函数),可以调整Vector的大小,以及容量(容量的改变是通过为基本数组分配一个新的内存块,然后复制 ...
- 模板 RMQ问题ST表实现/单调队列
RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,R ...
- c++11-17 模板核心知识(二)—— 类模板
类模板声明.实现与使用 Class Instantiation 使用类模板的部分成员函数 Concept 友元 方式一 方式二 类模板的全特化 类模板的偏特化 多模板参数的偏特化 默认模板参数 Typ ...
- C++进阶-1-模板基础(函数模板、类模板)
C++进阶 模板 1.1 函数模板 1 #include<iostream> 2 using namespace std; 3 4 // 模板 5 6 // 模板的简单实例 7 // 要求 ...
- SpringSecurity结合数据库表实现权限认证
SpringSecurity结合数据表实现权限认证: 下面的案例是在SpringBoot框架实现的: 步骤一:准备数据库表 以下是五张表的脚本 ### 用户表 create table Sys_Use ...
- 图论——图的邻接表实现——Java语言(完整demo)
1.图的简单实现方法——邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法. 对于每条边(u,v),置A[u,v]等于true:否则 ...
- C++学习笔记50:队列类模板
队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h ...
- C++学习笔记47:链表的概念与结点类模板
学堂在线学习笔记 链表的概念与结点类模板 顺序访问的线性群体--链表类 链表是一种动态数据结构,可以用来表示顺序访问的线性群体: 链表是由系列结点组成,结点可以在运行时动态生成: 每一个结点包括数据域 ...
- 《C++ Primer Plus》14.4 类模板 学习笔记
14.4.1 定义类模板下面以第10章的Stack类为基础来建立模板.原来的类声明如下:typedef unsigned long Item; class Stack{private: enum ...
随机推荐
- RabbitMQ配置文件(advanced.config)
这是advanced.config配置文件示例: [ %% ------------------------------------------------ --------------------- ...
- SQL Server解惑——标识列的限制和跳号现象
1:每个表只能创建一个标识列. 如下测试所示,如果表中有一个标识列,新增一个标识列就会遇到错误"Multiple identity columns specified for table ...
- 初学WebGL引擎-BabylonJS:第2篇-基础模型体验
此次学习进度会比之前快很多,有了合适的学习方法后也就会有更多的乐趣产生了. 接上一章代码 上章代码 <!DOCTYPE html> <html> <head> &l ...
- F - 丘 (欧拉函数)
Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own ...
- 你不知道的JavaScript笔记----对象
对象: 1.定义对象属性 属性描述符(也称为:数据描述符) Object.defineProperty(Object,PropertyName,{ value: 6, writable: true, ...
- MyBatis源码骨架分析
源码包分析 MyBatis 源码下载地址:https://github.com/MyBatis/MyBatis-3 MyBatis源码导入过程: 下载MyBatis的源码 检查maven的版本,必须是 ...
- leetcode刷题-36有效的数独
题目 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔 ...
- SpringBoot打Jar包在命令行运行
首先写一个测试文件 然后点击IDEA右侧的maven,然后选择package,之后点击上面运行或者直接双击即可, 等下方控制台构建成功即可: 然后找到项目目录下target下即可看到打的jar包 然后 ...
- 转发请求RequestDispatcher()方法用于与页面的交互
jsp1代码 <form action="HelloServlet" > 账号: <input type="text" name=" ...
- Redis之命令详解
Redis命令手册:http://doc.redisfans.com/