srilm 阅读文档3

来源:互联网 发布:微信聊天记录数据恢复 编辑:程序博客网 时间:2024/06/07 01:57

Map.h Map.cc
文档作者: jianzhu
创立时间:08.08.23
--------------------------------------
1、基本类
--------------------------------------
    这两个文件主要以模板方式定义了一个映射类型(Map)的容器,该容器由三个类
_Map、MapEntry、Map刻画。同时定义了用于键初始化和判读键是否存在的函数。
    继承结构图(Map.bmp)
_Map类
该类定义了映射类型共有的属性,因此该类中的属性均为static类型。
    a) 初始空间大小 (initialSize)
    b) 空间扩展比例 (growSize)
    c) 默认检索是否成功的布尔变量 (foundP)
MapEntry类
该类定义了映射类型的“键->值”数据结构,因此该类需要设计为模板类。
    a) “键”成员变量 (key)
    b) “值”成员变量 (value)
Map类
该类为一个抽象基类,定义了映射类型(Map)的容器需要提供的几个函数
    a) 查找函数
    b) 插入函数
    c) 删除函数
    d) 清空函数
    e) size函数
    f) getInternalKey函数
    g) memStats函数
    
键函数
键函数主要用于初始化容器和判断某一单元是否被存储,同时定义了键拷贝
和释放函数。
    a) 键拷贝函数
    b) 键释放函数
    c) 键初始化函数
    d) 键判断函数
    
--------------------------------------
2、函数功能解释
--------------------------------------
Map类
a) 查找函数
<src>
0  virtual DataT *find(KeyT key, Boolean &foundP) const = 0;
</src>
  功能:该函数用于键查找,同时返回键对应的值指针。如果容器中
  不含该键则返回NULL,并将foundP设为false。因此该函数中的foundP
  是一个可选的参数。
  
b) 插入函数
<src>
0  virtual DataT *insert(KeyT key, Boolean &foundP) = 0;
</src>
  功能:该函数用于键插入,同时返回键对应的值的指针。如果容器中
  含有该键则将foundP设为true,否则foundP为false。
c) 删除函数
<src>
0  virtual DataT *remove(KeyT key, Boolean &foundP) = 0;
</src>
  功能:该函数用于从容器中删除键和其对应的值,并返回键对应的值的
  指针,如果容器中不含有该键则将foundP设为false。
d) 清空函数
<src>
0  virtual void clear(unsigned int size) = 0;
</src>
  功能:该函数用于将容器中的所有元素清空,并将容器初始化为size指定
  的空间大小。
  
e) size函数
<src>
0  virtual unsigned int numEntries() const = 0;
</src>
  功能:该函数用于返回容器中保存的“键->值”对数目。
  
f) getInternalKey函数
<src>
0  virtual KeyT getInternalKey(KeyT key, Boolean &foundP) const = 0;
</src>
  功能:该函数用于返回键在容器中的表示方式,如果容器中不含该键则将
  foundP设为false。
g) memStats函数
<src>
0  virtual void memStats(MemStats &stats) const = 0;
</src>
  功能:该函数用于计算当前容器的内存使用量。
  
键函数
a) 键拷贝函数
<src>
0  template <class KeyT>
1  inline KeyT Map_copyKey(KeyT key)
2  { 
3    return key; 
4  }
5  
6  inline const char *Map_copyKey(const char *key) 
7  { 
8    return strdup(key);
9  }
</src>
  功能:用于对键进行拷贝
  细解:由于字符串需要进行“深”拷贝,所以在第6-9行定义了
  字符串类型的键拷贝函数。这样做的目的是为类正确进行内存
  回收。
   
b) 键释放函数
<src>
0  template <class KeyT>
1  inline void Map_freeKey(KeyT key) 
2  {
3  }
4
5  inline void Map_freeKey(const char *key) 
6  { 
7    free((void *)key);
8  }
</src>
  功能:用于对键所占用的内存回收
  细解:由于字符串类型的键拷贝的时候进行了“深”拷贝,所以在
  第5-8行定义了字符串类型的键释放函数。
c) 键初始化函数
<src>
0  template <class KeyT>
1  inline void Map_noKey(const KeyT *&key) 
2  { 
3     key = 0;
4  }
</src>
  功能:用于对键进行初始化
   
  注:该文件同时定义了针对short、int、long、unsigned short、
  unsigned、unsigned long类型的整数的初始化函数。针对signed
  类型采用最小的整数来初始化,针对unsigned类型采用最大的整数
  来初始化。
  
d) 键判断函数
<src>
0  template <class KeyT>
1  inline Boolean Map_noKeyP(const KeyT *key)
2  { 
3   return key == 0; 
4  }
</src>
  功能:用于判断键是否为空
  
  注:该文件同时定义了针对short、int、long、unsigned short、
  unsigned、unsigned long类型的整数的判断函数。针对signed
  类型采用最小的整数来判断,针对unsigned类型采用最大的整数
  来判断。
 
--------------------------------------
3、知识点
--------------------------------------
1、映射类型
       映射类型一般应提供以下几个功能函数,也即功能。
      a) 查找函数
      b) 插入函数
      c) 删除函数
      d) 清空函数
      e) size函数
   其中查找、插入、删除等几个函数可以将返回值设为“值”的指针类型
   这样做达到了一次查找即可以达到同时插入对应值的目的。
2、static成员变量
       对于由几个对象共享的成员变量,可以将其声明为static类型。
   static类型的变量独立于对象是否声明。
3、抽象问题
       对于由几个类型共有的属性,可以将其抽象出来并形成一个基类,
   其他类都继承自该类,这样做充分利用了面向对象的特性。

原创粉丝点击