1. 实现一个动态数组,要求对于随机访问可以在常数时间完成,可以通过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

最新文章

  1. Elasticsearch之java的基本操作一
  2. CSS样式重置(转)
  3. ThinkPHP 利用.htaccess文件的 Rewrite 规则隐藏URL中的 index.php
  4. Caffe使用:如何将一维数据或其他非图像数据转换成lmdb
  5. Oracle之DBMS_RANDOM包详解
  6. bzoj3998: [TJOI2015]弦论
  7. SQL语句执行时间测试
  8. Android基础总结(8)——服务
  9. s3c6410_中断
  10. hdu 4223
  11. C#-创建自定义双击事件
  12. WordPress Woopra Analytics插件‘ofc_upload_image.php’任意PHP代码执行漏洞
  13. 18、MySQL内存体系架构及参数总结
  14. ubuntu 12.04(Precise Pangolin)启用休眠(Hibernate)功能的方案
  15. 依赖注入及AOP简述(七)——FQCN请求模式
  16. flume-ng+Kafka+Storm+HDFS 实时系统组合
  17. Google Chrome Plus&mdash;&mdash;绿色便携多功能谷歌浏览器
  18. Microsoft CRM-QueryExpression 成员
  19. 如何改善SSH连接过慢(效率)
  20. 死锁与递归锁 信号量 event 线程queue

热门文章

  1. ThinkPHP3.2.3中,配置文件里配置项的读取
  2. MySql用户配置
  3. 萌新三分讲解+基础题ZOJ3203【三分凸性】
  4. 51nod 1013【快速幂+逆元】
  5. c#file类读写
  6. C#递归得到特定文件夹下问件
  7. C 语言实例 - 字符串复制
  8. POJ-1062-昂贵的聘礼(枚举)
  9. [在读] javascript权威指南第六版
  10. hdu2475Box(splay树形转线性)