使用类模板的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 ...
随机推荐
- 基于python tkinter的课堂点名小程序
import datetime import json import os import random import tkinter as tk import openpyxl # 花名册文件名很多人 ...
- zabbix如何监控Nvidia显卡的各项指标?
如何实现zabbix监控windows机器的N卡GPU指标呢? Nvidia卡在安装驱动程序的时候,已经自带安装了一个命令行工具来获取显卡的各个性能指标值 在windows机器上,我们可以把该路径加入 ...
- Vue.js学习(八)—— 树形结构下拉框组件vue-treeselect
vue-treeselect是一个多选组件,具有对Vue.js的嵌套选项支持. 具有嵌套选项支持的单个和多个选择 模糊匹配 异步搜索 延迟加载(仅在需要时加载深层选项的数据) 键盘支持(使用Arrow ...
- C++轻量级跨平台文件系统API
http://en.cppreference.com/w/cpp/experimental/fs https://www.starmessagesoftware.com/cpcclibrary htt ...
- [BUUOJ记录] [BJDCTF 2nd]文件探测
感觉算是这次比赛里面综合性很强的一道题了,主要考察SSRF.PHP伪协议包含.挖掘逻辑漏洞和一个小tirck.委屈的是第一天晚上就做到了最后一步,想到了SESSION置空即可绕过,但是最后读Flag姿 ...
- 浅谈HASH长度拓展攻击
前言 最近在做CTF题的时候遇到这个考点,想起来自己之前在做实验吧的入门CTF题的时候遇到过这个点,当时觉得难如看天书一般,现在回头望去,仔细琢磨一番感觉也不是那么难,这里就写篇文章记录一下自己的学习 ...
- jinja2快速实现自定义的robotframework的测试报告
一.背景 RF的结果报告可以方便我们查看每一条用例集.用例的执行结果统计,但是有的项目涉及到一些数据的比对,希望能够直观到看到数据,原生的测试报告就无法满足这个需求了. 原生的报告 项目需求报告格式 ...
- java之5分钟插入千万条数据
虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢.10分钟内基本能看到结果. 之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据. 线程 ...
- Java8的日期时间处理
代码: package com.ufo.java8datetime; import java.time.Clock; import java.time.LocalDate; import java.t ...
- leetcode刷题-40组合总和2
题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用 ...