使用类模板的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 ...
随机推荐
- windows设置定时执行脚本
如果你写了一些Python程序,想要在特定的时间进行执行,例如你想让一段爬虫程序在每天的上午10点执行一次,那么我们就可以来使用windows自带的定时任务进行设置.由于Windows系统,无法使用L ...
- const定义的对象属性是否可以改变------是!
用const声明person对象,给age重新赋值是没问题的 但是重新给person赋值是不可以的 这里需要了解'基本数据类型'和'引用数据类型' 基本数据类型:string, number, boo ...
- 10.redis cluster介绍与gossip协议
一.redis cluster 介绍 自动将数据进行分片,每个 master 上放一部分数据 提供内置的高可用支持,部分 master 不可用时,还是可以继续工作的 redis cluster架构下的 ...
- 读网文《将20M文件从30秒压缩到1秒,我是如何做到的?》做实验
先在微信公众号上看到网文<将20M文件从30秒压缩到1秒,我是如何做到的?>,然后在网上搜索了一下,看到了原文:https://www.jianshu.com/p/2e46ccb125ef ...
- 为什么ping不通google.com
前言 为什么在ping不通Google的时候,我们却可以web直接访问Google (已开启SSR 翻 墙) SSR访问Google 因为GFW的限制导致国内无法直接访问谷歌,那么SSR为什么能绕过限 ...
- Linux:文件和用目录权限基础
首先,用ls -i 查看文件的信息: 红框框起来的部分:-rw-r--r-- 一共是10位,第一位表示文件类型,-表示文件,d表示文件夹/目录:后面9位则表示权限 其中前三位是该文件/目录所属者的权限 ...
- python:接口开发
一.flask flask是一个python编写的轻量级框架,可以使用它实现一个网站或者web服务.本文就用flask来开发一个接口. flask需要先安装再引用.pip install flask ...
- jackson序列化与反序列化的应用实践
jackson序列化与反序列化的应用实践 源码地址: https://github.com/zhouweixin/serializable 1 相关概念 序列化: 把对象转换为字节序列的过程称为对象的 ...
- 【python】itchat登录微信获取好友签名并生成词云
在知乎上看到一篇关于如何使用itchat统计微信好友男女比例并使用plt生成柱状图以及获取微信好友签名并生成词云的文章https://zhuanlan.zhihu.com/p/36361397,感觉挺 ...
- 大神Java8写了一段逻辑,我直呼看不懂
业务背景 首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传. 而第三方接口返回的数据是 JSON 格式的,其中 ...