C++实现动态数组
- 实现一个动态数组,要求对于随机访问可以在常数时间完成,可以通过push_back向数据的尾部追加元素,可以通过pop_back删除尾部元素,能够满足常见的数组操作。 LINE 2016年春招笔试
这里说的动态数组是可以根据需要动态增长占用内存的数组,比如程序初始分配了100个元素,可是运行了一段时间后区区100个空间不能满足了,现在需要400个,怎么办呢;那肯定需要再额外分配300个。
C语言有realloc()函数来解决空间扩充的问题,但是不要忘了realloc可能会迁移内存,会发现数据要复制
C++中的vector和这个题的要求很像,但是vector在扩展内存的时候,也是要复制数据
一次分配足够的空间是可以解决这个问题,很明显这会造成内存的浪费,这个做法不算明智。
不使用数组呢?使用list能解决一部分问题,但是list不能支持随机访问啊,鉴于效率上的硬伤,显然不能随便用list替换数组。
怎么解决这个问题呢?动态数组
动态数组的特征
动态数组是一个很简单易用的数据结构,但是简单不代表优点小,它的特征如下:
1 根据需要动态批量增长内存;
2 一经分配,元素地址不会再次变化;
3 实现简单,效率高,事实上它和普通数组相比基本没有效率损失;
4 最大个数固定;
其实最重要的就是特征2了,不然直接使用realloc多方便呢,当然动态数组的实现也很方便
#include<iostream>
using namespace std;
//动态数组,最多200个单位,空间不够的时候,一次自动增长10个单位 ,所以capacity是size的最接近10的数
class DArray
{
public:
int* section[20];
int size;//动态数组的实际大小
int capacity;//动态数组最多能容纳多少
DArray(int sizep)//指定动态数组大小,并初始化成0
{
if(sizep<=200)
{
int time=0;
if(size%10==0)//如果size是30的话,最大的数保存到29,就是0 1 2 三个数组
{
time=sizep/10-1;
capacity=size;
}
else
{
time=sizep/10;
capacity=(time+1)*10;
}
for(int i=0; i<=time; i++)//多初始化一些也没有关系
{
section[i]=new int[10];
for(int j=0;j<10;j++)
section[i][j]=0;
}
size=sizep;
}
else
cout<<"无法分配超过200的空间!"<<endl;
}
int& operator[](int index)//重载方括号
{
int sec=index/10;
int offset=index%10;
return section[sec][offset];
} //A reference shall be initialized to refer to a valid object or function.
int resize(int newSize)//重新分配数组大小,如果newSize>size,则用0填充
{
if(newSize<=200)
{
if(newSize<=capacity)//现在还是装的下的
{
if(size<newSize)//从小到大是 size newSize capacity
for(int i=size;i<newSize;i++)
section[size/10][i%10]=0;
}
else
{//这样的话从小到大就是 size capacity newSize
for(int i=size;i<capacity;i++)
section[size/10][i%10]=0;
while(capacity<newSize)//多初始化一些,没有关系
{
section[capacity/10]=new int[10];
for(int i=0;i<10;i++)
section[capacity/10][i]=0;
capacity+=10;
}
}
size=newSize;
}
else
return 0;
}
void push_back(int ele)
{
if(size<=199)
{
if(size==capacity)//需要扩容
{
section[capacity/10]=new int[10];
capacity+=10;
}
section[size/10][size%10]=ele;
size++;
}
else
cout<<"已满!"<<endl;
}
void pop_back()
{
size--;
}
~DArray()
{
while(capacity>0)
{
delete [] section[capacity/10-1];
capacity-=10;
}
cout<<"已经析构!"<<endl;
}
};
int main()//测试动态数组
{
DArray array(2);
for(int i=0; i<24; i++)
{
array.push_back(i);
}
for(int i=0;i<array.size;i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
cout<<"size: "<<array.size<<" capacity: "<<array.capacity<<endl;
array.resize(35);
for(int i=0;i<array.size;i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
cout<<"size: "<<array.size<<" capacity: "<<array.capacity<<endl;
// array
}
动态数组结构如下:
|
0 |
1 |
2 |
3 |
4 |
9 |
capacity |
||||
|
0 |
9 |
10 |
||||||||
|
1 |
19 |
20 |
||||||||
|
2 |
29 |
30 |
||||||||
|
3 |
39 |
40 |
||||||||
|
4 |
49 |
50 |

思路来自 http://blog.csdn.net/sparkliang/article/details/5359634
C++实现动态数组的更多相关文章
- 常用数据结构-线性表及Java 动态数组 深究
[Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...
- C语言 · 动态数组的使用
从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...
- C++中关于[]静态数组和new分配的动态数组的区别分析
这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...
- C++之动态数组
C99支持一种名为变长数组的结构来方便程序员.C++也提供了一种长度可在程序运行时确定的数组类型:动态数组.声明格式为:(声明 int 类型的数组) ; //此处可修改 ArraySize 的值 in ...
- VB默认属性、动态数组、Range对象的默认属性的一点不成熟的想法
1.默认属性 VB6.0有默认属性的特性.当没有给对象指定具体的属性时,"默认属性"是VB6.0将使用的属性.在某些情形下,省略常用属性名,使代码更为精简. 因为CommandBu ...
- C#有关数组内存的释放及动态数组问题
一.数组内存释放问题 数组内存的释放可以按照如下语句实现: string [] aa=new string[2]; aa[0]="A"; aa[1]="B"; ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- C++ 动态数组实例
一维动态数组的实例: #include <iostream> using namespace std; int main() { int *arr; int n; cout<< ...
- C++动态数组
一: 一维数组初始化 标准方式1:int value[100]; //value[i]的值不定,因为没有初始化:标准方式2:int value[100] = {1,2,3}; //value[0],v ...
- ALLOCATE语句分配FORTRAN动态数组方法(转自http://blog.csdn.net/zhuxianjianqi/article/details/8067174)
数组的动态分配 a) 可分配数组 数组可以是静态的也可以是动态的.如果数组是静态的,则在编译时就被分配了固定的储存空间,并且直到程序退出时才被释放.程序运行时静态数组的大小不能改变.静态数组的缺 ...
随机推荐
- CodeForces 1098E. Fedya the Potter
题目简述:给定长度为$n \leq 5\times 10^4$的序列$a_1, a_2, \dots, a_n \leq 10^5$.将$\gcd(a_l, a_{l+1}, \dots, a_r) ...
- 2.12 Hivet中order by,sort by、distribute by和cluster by
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy 一.order by 对全局数据的排序,仅仅只有一个red ...
- Binder使用示例(转载)
转自:http://blog.csdn.net/new_abc/article/details/8097775
- 一个C#开发者重温C++的心路历程
不知道为什么,似乎很多人理解跑偏了,在这里我要说明一下. 首先,我并没有对C++语言有偏见,我只是单纯的在学习时,在理解时,对C++语言进行一些吐槽,我相信,很多学习C++的人,也会有类似的吐槽. 其 ...
- (十二)SpringBoot 设置定时任务
一:创建定时任务 创建core→tesks→tesk.java package com.example.demo.core.tasks; import org.springframework.sche ...
- Win7下Intellij开发Scala环境搭建
1.Scala下载并安装 1.Scala的安装时需要依赖JDK的,目前我的电脑上,jdk是已经安装好了,这里就不再说明 2.在地址http://www.scala-lang.org/download/ ...
- P3809【模板】后缀排序
传送门 深入理解了一波后缀数组,这东西真的很妙诶,自己推感觉完全不现实,看来只能靠背代码了 这段时间就多敲敲,把板子记熟吧 代码: #include<cstdio> #include< ...
- DRF教程1-序列化
序列化类 要建立web API,要做的第一件事就是对实例进行序列化,比如以json方式显示.我们可以生命序列化,它和django的forms很相似.在app目录下创建serializers.py fr ...
- CF #541div2 D
题目本质:形成一个拓扑图,不应带自环. 解决方法: 1.先把等于号的部分用dsu缩点: 2.大于和小于号建立拓扑关系: 3.n*m的矩阵,只要用标号n+j代表m集合的第j个就从二维降到一维了: 4.d ...
- 类加载机制 + Classloader.loadClass(String name)和Class.forName(String name)
Classloader.loadClass(String name)和Class.forName(String name)的区别 Java的类在jvm中的加载大致分为加载,链接或者叫link(里面包含 ...