程序设计2

原创 2006年06月02日 15:31:00

 

程序设计1的问题,简单叙述其需求如下:

需要一种结构,要满足

(1)       其访问速度需要与数组基本一致,可随机存取。

(2)       无法预先知道其精确的存储空间,不应该先行扫描文本串来获得这个值,以避免时间效率的损失。

(3)       在申请存储空间失败的时候,可以进行有效的反应,不应使程序失控。

后来跟踪那个问题,发现文本数据中因为是专业技术文档的缘故,有大量的格式标注符号,其中的词汇信息若按不重复计应该是不超出百万级别的(中文词汇的个数有个基本的上限)。所以简单写了个模板类,实现:预先设定空间时并不申请所有空间、而在实际存取过程中动态分配空间,并且可以基本满足上述三个目标 这些特征。代码如下:

 

 

#ifndef __SIMPLEARRAY_H__

#define __SIMPLEARRAY_H__

 

/*

* 数组的模板类

* 数组的对象有两种类型,一是可c指针输出的(称为C格式Array),另一个是有着自己内存管理

* 方式的数组。后者的管理方式是,对于超过MAX_BLOCK_SIZE的数据,以块的方式进行组织。块的

* 最大个数为MAX_BLOCK_NUM。如此对于一定规模内(MAX_BLOCK_NUM*MAX_BLOCK_SIZE)的数据

* 既可以按照数组的随机存取方式访问数据,又可以根据实际需要自动申请空间,且不存在存储

* 数据移动的现象(如在动态数组中);代价是最多浪费近一个块的空间。

* 在实例化对象时需要指定类型(默认类型为非c格式数组),且类型不可改变。

****************************************************************************************/

#define       MAX_BLOCK_NUM      100

#define       MAX_BLOCK_SIZE         10000

 

template<typename T>

class CSimpleArray

{

public:

     CSimpleArray(bool bCArray = false);

     ~CSimpleArray(void);

 

     // 设置存储空间大小

     bool SetSize(int Size);

     // 获得存储空间大小

     int      GetSize(void);

     // 获得某位置的值引用

     T&       GetValue(int At);

     // 转换成c形式的数组(指针表示)

     T*       TO_C_ARRAY(void);

     // 释放资源

     void Clear(void);

 

private:

     void SetBlockNum(void);

 

private:

     T*       pValue;

     T**      pBlockValue;

     int      size;

     int      blockNum;

     int      curBlockNum;

 

     bool bAsCArray;

};

 

template<typename T>

CSimpleArray<T>::CSimpleArray(bool bCArray/* = false*/)

{

     pValue = NULL;

     pBlockValue = NULL;

     size = 0;

     blockNum = 0;

     curBlockNum = 0;

 

     bAsCArray = bCArray;

}

 

template<typename T>

CSimpleArray<T>::~CSimpleArray(void)

{

     Clear();

}

 

template<typename T>

void CSimpleArray<T>::SetBlockNum(void)

{

     blockNum = size/MAX_BLOCK_SIZE + 1;

     if( blockNum > MAX_BLOCK_NUM )

         blockNum = MAX_BLOCK_NUM;

}

 

template<typename T>

bool CSimpleArray<T>::SetSize(int Size)

{

     if( Size <= 0 || this->size == Size )

     {

         curBlockNum = 0;

         return true;

     }

 

     Clear();

     this->size = Size;

     if( Size > MAX_BLOCK_SIZE && !bAsCArray )

     {

         SetBlockNum();

         curBlockNum = 0;

         if( NULL == (pBlockValue = new T*[MAX_BLOCK_NUM]) )

              return false;

         for( int i = 0; i < MAX_BLOCK_NUM; i ++ )

              pBlockValue[i] = NULL;

     }

     else

     {

         if( NULL == (pValue = new T[size]) )

             return false;

     }

 

     return true;

}

 

template<typename T>

int CSimpleArray<T>::GetSize(void)

{

     return size;

}

 

template<typename T>

T& CSimpleArray<T>::GetValue(int At)

{

     if( At < 0 || At >= size )

         throw "GetElemException of wrong pos in CSimpleArray";

 

     if( pValue || bAsCArray )

         return pValue[At];

     else //if( pBlockValue )

     {

         int blockPos = At/MAX_BLOCK_SIZE;

         int valPos = At%MAX_BLOCK_SIZE;

         if( blockPos >= blockNum )

              throw "GetElemException of wrong pos in CSimpleArray";

         // 取到没有值的块则对该位置申请空间

         if( blockPos >= curBlockNum )

          {

              for( int i = curBlockNum; i <= blockPos; i ++ )

                   if( !pBlockValue[i] )

                       if( NULL == (pBlockValue[i] = new T[MAX_BLOCK_SIZE]) )

                            throw "New Block Failed in CSimpleArray";

              curBlockNum = blockPos + 1;

         }

        

         return (pBlockValue[blockPos])[valPos];

     }

}

 

template<typename T>

void CSimpleArray<T>::Clear(void)

{

     if( pValue )

     {

         delete[] pValue;

         pValue = NULL;

         size = 0;

     }

     if( pBlockValue )

     {

         for( int i = 0; i < curBlockNum; i ++ )

         {

              delete[] pBlockValue[i];

              pBlockValue[i] = NULL;

         }

         delete[] pBlockValue;

         pBlockValue = NULL;

         blockNum = 0;

         curBlockNum = 0;

         size = 0;

     }

}

 

template<typename T>

T* CSimpleArray<T>::TO_C_ARRAY(void)

{

     return pValue;

}

 

 

#endif //__SIMPLEARRAY_H__

 

.NET组件程序设计(书)

开始读这个数, 好多东西不懂, 有待继续学习。
  • ghevinn
  • ghevinn
  • 2013年01月10日 10:47
  • 864

ROS机器人程序设计(原书第2版)补充资料 (零) 源代码、资料和印刷错误修订等 2017年02月22日更新

ROS机器人程序设计(原书第2版)补充资料 (零) 源代码等 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用。 稍后会补充,各章节针对indi...
  • ZhangRelay
  • ZhangRelay
  • 2016年11月25日 19:38
  • 9850

推荐一本学Python的好书《Python程序设计(第2版)》

本书最大特点是信息量大、知识点紧凑、案例丰富、实用性强。全书200多个涉及不同行业领域的实用案例,没有多余的文字、程序输出结果或软件安装截图,充分利用宝贵的篇幅来讲解尽可能多的知识,绝对物超所值。本书...
  • dongfuguo
  • dongfuguo
  • 2016年12月24日 16:21
  • 4562

《算法竞赛入门经典》读书笔记 第二章 循环结构程序设计

《算法竞赛入门经典》读书笔记 第二章 循环结构程序设计 2.1 For循环 知识点1:For循环语法结构  for(int i = 1; i        printf("%d\n",i)...
  • yzzxliuchao
  • yzzxliuchao
  • 2015年03月23日 10:24
  • 296

MFC Windows程序设计源码免费下载

本人最近在网上找到了《MFC Windows程序设计》第二版的书内程序的源码,特意上传CSDN上面,供学习MFC的程序员们免费下载。...
  • BBOOT
  • BBOOT
  • 2014年06月12日 19:03
  • 1300

实现2个按钮的程序

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TwoButtons { JFrame ...
  • leafinsnowfield
  • leafinsnowfield
  • 2015年08月09日 11:12
  • 200

【备忘】C++程序设计原理与实践 PDF下载

作者简介: Bjarne Stroustrup,英国剑桥大学计算机科学博士,C++的设计者和*初的实现者。他现在是德州农工大学计算机科学首席教授。1993年,由于在C++领域的重大贡献,他获得了AC...
  • maomi2maomi
  • maomi2maomi
  • 2016年12月01日 22:18
  • 1031

MFC Windows程序设计(第二版)精华浓缩笔记

      《MFC windows程序设计(第二版)》是一本介绍使用MFC(而不是win32 API),进行32位Windows应用程序设计的经典书籍。作者Jeff Prosise,被誉为MFC领域...
  • c_vector
  • c_vector
  • 2002年06月28日 13:48
  • 2488

【转贴】对《高质量程序设计指南--C++/C第二版》的探讨

《高质量程序设计指南——C++/C(第二版)》的读书心得             作者:fang_rk    写这篇文章是出于一个偶尔的原因:读计算机系的女友即将升入研究生三年级,她说想要看看这本书。...
  • abaowu
  • abaowu
  • 2005年04月29日 08:59
  • 2048

MFC Windows程序设计(第2版)(附源码)

又名: Programming Windows with MFC Second Edition 译者: 北京博彦科技发展有限公司作者: (美)Je...
  • manybooks
  • manybooks
  • 2009年10月28日 15:15
  • 856
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序设计2
举报原因:
原因补充:

(最多只允许输入30个字)