使用类模板的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 ...
随机推荐
- ARM开发板实现双系统引导的一种方法——基于迅为iTOP-4412开发板
前言 本文所用的uboot代码为迅为官方提供,开发板是迅为iTOP-4412开发板.本文如有错误,欢迎指正. 首先,我们确定一下系统启动的流程:首先启动uboot,uboot启动内核并挂载rootfs ...
- IntelliJ IDEA远程Debug Linux的Java程序,找问题不要只会看日志了
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 我们习惯于在本地开发的时候debug,能快速定位与解决问题,那部署在服务器上是不是就没有办法了呢?只能通过查看日志来定位? ...
- Spring JPA 定义查询方法
Spring JPA 定义查询方法 翻译:Defining Query Methods 存储库代理有两种方式基于方法名派生特定域的查询方式: 直接从方法名派生查询 自定义查询方式 可用选项基于 ...
- SpringCloud入门 消息总线 Bus
消息总线 1.概述 使用SpringCloud Bus配和Spring Cloud Config使用实现配置的动态刷新 Bus只支持消息处理:RabbitMQ和Kafaka. 能干嘛 能管理和传播分布 ...
- Centos7.6系统下docker的安装
一.环境说明 系统:CentOS7.6 软件:Docker19.03 二.Docker的安装 2.1.在线安装 (1) 设置仓库,安装所需的软件包. yum-utils 提供了 yum-config- ...
- 【CF】Sereja and Arcs
#include <bits/stdc++.h> #define llong long long using namespace std; const int N = 1e5; const ...
- 把Employees显示在页面上
项目代码下载:https://files.cnblogs.com/files/xiandedanteng/gatling20200429-1.zip 需求:从后台DB取出雇员数据,显示在前台页面上: ...
- 使用枚举类Enum作为callee和caller的约定,运用反射消除分支和重复代码在命令式程序中的应用
在开发过程中,程序提供的功能由简单变得复杂,承担功能的主要类也会因此变得庞大臃肿,如果不加以维护,就会散发出浓重的代码味道.下面这篇博文,主要讲述了利用Enum,反射等手段简化重构代码的过程. 代码涉 ...
- HTML模仿实现京东登录页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 微信小程序-组件-视图容器
1.view 1.作用:类似 html 的 div 用来进行页面布局,具有块级盒子特性. 2.常用属性:设置view盒子点击后的状态,以及控制是否影响父盒子的点击状态 3.eg:<view ho ...