回顾大二的数据结构知识。从数组开始。实现了一个可自动扩充容量的泛型数组。

头文件:Array.h

#ifndef Array_hpp
#define Array_hpp template <class T>
class Array{
private:
T *base; //数组首地址
int length; //数组中元素
int size; //数组大小,以数组中元素的大小为单位
public:
//初始化数组,分配内存
bool init();
//检查内存是否够用,不够用就增加
bool ensureCapcity();
//添加元素到数组尾
bool add(T item);
//插入元素到数组的具体位置,位置从1开始
bool insert(int index,T item);
//删除指定位置的元素并返回,位置从1开始
T del(int index);
//返回指定位置的元素
T objectAt(int index);
//打印数组所有元素
void display();
}; #endif /* Array_hpp */

实现:Array.cpp

#include "Array.hpp"
#include <mm_malloc.h>
#include <iostream>
using namespace std; template<typename T> bool Array<T>::init(){
base = (T *)malloc(10*sizeof(T));
if(!base){
return false;
}
size = 10;
length = 0;
return true;
} template<typename T> bool Array<T>::ensureCapcity(){
if(length >= size){
T *newBase = (T*)realloc(base,10 * sizeof(T) + size);
if(!newBase){
return false;
}
base = newBase;
size += 10;
newBase = nullptr;
}
return true;
} template<typename T> bool Array<T>::add(T item){
if(!ensureCapcity()){
return false;
}
T *p = base + length;
*p = item;
length ++;
return true;
} template<typename T> bool Array<T>::insert(int index,const T item){
if(!ensureCapcity()){
return false;
}
if(index < 1 || index > length){
return false;
}
T *q = base + index - 1;
T *p = base + length - 1;
while( p >= q){
*(p+1) = *p;
p--;
}
*q = item;
q = nullptr;
p = nullptr;
length ++;
return true;
} template<typename T>T Array<T>::del(int index){
if(index<1 || index > length){
return NULL;
}
T *q = base + index - 1;
T item = *q;
++q;
T *p = base + length;
while(q <= p){
*(q-1)=*q;
++q;
}
length --;
return item;
} template<typename T>T Array<T>::objectAt(int index){
if(index<1 || index > length){
return NULL;
}
T *q = base;
return *(q + index - 1);
} template <typename T>void Array<T>::display(){
T *q = base;
T *p = base +length - 1;
while (q<=p) {
cout << *(q++)<<" ";
}
cout << endl;
}

使用:

#include <iostream>
#include "Array.cpp"
using namespace std; int main(int argc, const char * argv[]) {
Array<int> array = *new Array<int>;
array.init();
array.add(1);
array.insert(1,2);
array.objectAt(1);
return 0;
}

动态数组C++实现的更多相关文章

  1. 常用数据结构-线性表及Java 动态数组 深究

    [Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...

  2. C语言 · 动态数组的使用

    从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...

  3. C++中关于[]静态数组和new分配的动态数组的区别分析

    这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...

  4. C++之动态数组

    C99支持一种名为变长数组的结构来方便程序员.C++也提供了一种长度可在程序运行时确定的数组类型:动态数组.声明格式为:(声明 int 类型的数组) ; //此处可修改 ArraySize 的值 in ...

  5. VB默认属性、动态数组、Range对象的默认属性的一点不成熟的想法

    1.默认属性 VB6.0有默认属性的特性.当没有给对象指定具体的属性时,"默认属性"是VB6.0将使用的属性.在某些情形下,省略常用属性名,使代码更为精简. 因为CommandBu ...

  6. C#有关数组内存的释放及动态数组问题

    一.数组内存释放问题 数组内存的释放可以按照如下语句实现: string [] aa=new string[2]; aa[0]="A"; aa[1]="B"; ...

  7. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  8. C++ 动态数组实例

    一维动态数组的实例: #include <iostream> using namespace std; int main() { int *arr; int n; cout<< ...

  9. C++动态数组

    一: 一维数组初始化 标准方式1:int value[100]; //value[i]的值不定,因为没有初始化:标准方式2:int value[100] = {1,2,3}; //value[0],v ...

  10. ALLOCATE语句分配FORTRAN动态数组方法(转自http://blog.csdn.net/zhuxianjianqi/article/details/8067174)

    数组的动态分配 a)    可分配数组 数组可以是静态的也可以是动态的.如果数组是静态的,则在编译时就被分配了固定的储存空间,并且直到程序退出时才被释放.程序运行时静态数组的大小不能改变.静态数组的缺 ...

随机推荐

  1. Linux vi命令快操作汇总

    第一部份:一般指令模式可用的按钮說明,游标移动.复制粘贴.搜寻取代等 一.移动游标的方法h 或 向左方向鍵(←) 游标向左移动一个字节j 或 向下方向鍵(↓)   游标向下移动一个字节k 或 向上方向 ...

  2. 数据的图表统计highcharts

    数据统计常用的图表一般是饼状图.柱状图.线状图,HighCharts可以很好的实现. HighCharts highcharts是基于jquery的一个功能强大的插件,使用时先导入jquery.js ...

  3. APICloud开发小技巧(一)

    apicloud开发文档中,前端开发框架指的就是,类似jq\js的语法: https://docs.apicloud.com/Front-end-Framework/framework-dev-gui ...

  4. 'input propertychange' 当输入框文字改变时触发的事件!

    $('.amount_input').bind('input propertychange', function() { console.log(2); $('.list label').remove ...

  5. Linux常用命令速查

    索引表格 命令 功能简述 目录与文件基本操作 pwd 显示当前目录 ls 列出目录和文件名称 cp 复制文件或目录 mv 移动或更名现有的文件或目录 rm 删除文件或目录 mkdir 新建目录 rmd ...

  6. nyoj158-省赛来了

    省赛来了 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 一年一度的河南省程序设计大赛又要来了. 竞赛是要组队的,组队形式:三人为一队,设队长一名,队员两名. 现在问题就 ...

  7. BZOJ 3028 食物 (生成函数+数学题)

    题面:BZOJ传送门 题目让我们求这些物品在合法范围内任意组合,一共组合出$n$个物品的方案数 考虑把每种食物都用生成函数表示出来,然后用多项式乘法把它们乘起来,第$n$项的系数就是方案数 汉堡:$1 ...

  8. django rest-farme-work 的使用(1)

    Django REST框架是一个用于构建Web API的强大且灵活的工具包 您可能想要使用REST框架的一些原因: 可浏览性 身份认证 支持ORM和非ORM的序列化 良好的文档支持 安装初步 pip ...

  9. vue 如何动态切换组件,使用is进行切换

    日常项目中需要动态去切换组件进行页面展示. 例如:登陆用户是“管理员”或者“普通用户”,需要根据登陆的用户角色切换页面展示的内容.则需要使用 :is 属性进行绑定切换 <template> ...

  10. 2019-03-28 SQL inner left full

    在使用 join 时,on 和 where 条件的区别如下: 1. on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录. 2.where 条件是在临时表生成好 ...