要想進行二次開發,先進行分析之一:

我們開始介紹第一個類:HashTable

class HashTable {
public:
  virtual ~HashTable();
  //以下必須由一個特定子類實現
  static HashTable* create(int keyType);//靜態方法主要是爲了實現單例模式,一種數據只能實現一種特定的HashTable
  virtual void* Add(char const* key, void* value) = 0;//虛方法,需子類實現
  // Returns the old value if different, otherwise 0
  virtual Boolean Remove(char const* key) = 0;
  virtual void* Lookup(char const* key) const = 0;
  // Returns 0 if not found
  virtual unsigned numEntries() const = 0;
  Boolean IsEmpty() const { return numEntries() == 0; }//是否爲空
  // Used to iterate through the members of the table:
  class Iterator {//HashTable內的指針
  public:
    static Iterator* create(HashTable const& hashTable);
    virtual ~Iterator();    
    virtual void* next(char const*& key) = 0; // returns 0 if none  
  protected:
    Iterator(); // 子類能夠使用
  };
  //可用於先後刪除每個表中的條目
  void* RemoveNext();
  //返回表中的第一個條目。
  void* getFirst();  
protected:
  HashTable(); // abstract base class
};

第二個介紹 BasicHashTable


class BasicHashTable: public HashTable {
private:
	class TableEntry; // forward

public:
  BasicHashTable(int keyType);//創建基本的HashTable 有字符型也有字符串型的 還有別的類型,對最小表的清空
  virtual ~BasicHashTable();//刪除每個key對應的TableEntry,如果新建豎着的TableEntry*,就需要刪除新建的大小

  // Used to iterate through the members of the table:
  class Iterator; friend class Iterator; // to make Sun's C++ compiler happy
  class Iterator: public HashTable::Iterator {
  public:
    Iterator(BasicHashTable const& table);
  private:
    void* next(char const*& key); // returns 0 if none
	//初始時TableEntry*爲空,index++找到下一個不爲空的TableEntry,然後給下一個給fNextEntry,返回當前value
  private:
    BasicHashTable const& fTable;
    unsigned fNextIndex; // 記錄下一個的index
    TableEntry* fNextEntry; // 在當前表中下一個TableEntry
  };

private:
  virtual void* Add(char const* key, void* value);//向豎着的某key對應的TableEntry*中添加一個value,
  //因多個key估計對應一個index,所以要遍歷整個TableEntry*找到對應的key
  // 如果在這HashTable,找到該key,返回以前數據,更新表;沒有找到返回0,並在結尾添加新的TableEntry
  virtual Boolean Remove(char const* key);//刪除TableEntry
  virtual void* Lookup(char const* key) const;//返回key的TableEntry的value
  // Returns 0 if not found
  virtual unsigned numEntries() const;

private:
  class TableEntry {
  public:
    TableEntry* fNext;//這是個鏈表,相當於HashTable裏面的一個key所對應的離岸邊
    char const* key;
    void* value;
  };

  TableEntry* lookupKey(char const* key, unsigned& index) const;
    // returns entry matching "key", or NULL if none
  Boolean keyMatches(char const* key1, char const* key2) const;
    // used to implement "lookupKey()"

  TableEntry* insertNewEntry(unsigned index, char const* key);
    // creates a new entry, and inserts it in the table
  void assignKey(TableEntry* entry, char const* key);
    // used to implement "insertNewEntry()"

  void deleteEntry(unsigned index, TableEntry* entry);
  void deleteKey(TableEntry* entry);
    // used to implement "deleteEntry()"

  void rebuild(); // rebuilds the table as its size increases

  unsigned hashIndexFromKey(char const* key) const;
    // used to implement many of the routines above

  unsigned randomIndex(uintptr_t i) const {
    return (unsigned)(((i*1103515245) >> fDownShift) & fMask);
  }

private:
  TableEntry** fBuckets; //形象化描述如下
  // 2-3-4
  // |
  // 5-4-4-6
  // |
  // 7-2
  TableEntry* fStaticBuckets[SMALL_HASH_TABLE_SIZE];// 最小的HashTable
  unsigned fNumBuckets/*豎着的TableEntry鏈表長度*/, fNumEntries/*已存在實體個數*/, fRebuildSize/*重建豎着的TableEntry鏈表長度*/, fDownShift, fMask;
  int fKeyType/*該元素數據類型*/;
};




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章