程序设计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__

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

js高级程序设计笔记7--DOM2和DOM3

js

Oracle数据库程序设计学习笔记(2)

字体:Courier New 大小 10

《Windows程序设计》之POPUP2

#include #include "RESOURCE.H" #define ID_EDIT 1 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);...
  • l0g1n
  • l0g1n
  • 2012-05-05 16:53
  • 822

《C/C++/Java/Pascal 程序设计基础》习题集 解题2

题目链接:http://www.patest.cn/contests/basic-programming ,总体说来都是基础题,节省时间,只做了分值20的题目。 解题1链接:http://blog.c...

Java语言程序设计2(20)

欢迎来到考试百科网站,下面是由考试百科为广大考生提供的关于java语言程序设计2(20)的文章。感谢广大考生对考试百科的一致关注和支持,希望此文章会对广大考生有所帮助。希望广大考生继续支持考试百科,j...

Javascript高级程序设计——2.语法、关键保留字、变量

1、语法构成 (1)区分大小写      解析:在ECMAScript中的一切,包括变量、函数名、操作符都是区分大小写的   示例1—— text、Text是两种不同的变量。 (2)...

[连载]C#程序设计(04)--- C#核心编程-2 --- 语言元素、类型和变量

介绍了构成C#程序的语言元素,包括关键字、标识符、运算符、字面量和分隔符,讲解了类型、变量和常量相关的概念,探讨了C#内置的16中类型,包括13种值类型和3种引用类型

C++程序设计实验报告(五十八)---第九周任务2

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2012, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:流运...

团体程序设计天梯赛-练习集 L2-007. 家庭房产 解题报告

L2-007. 家庭房产 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。 输入格式: 输入第一行给出一个正整数N( 编号 父 ...

读《C程序设计语言》2E-3 [4~6]章

2016.02.22 - 04.05读《C程序设计语言》2E-3 [1~3]章1 练习02.22函数与程序结构练习4-1编写函数strrindex(s, t),它返回字符串t在s中最右边出现的位置、如...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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