要想进行二次开发,先进行分析之一:
来源:互联网 发布:工控机编程软件 编辑:程序博客网 时间:2024/06/06 05:45
我们开始介绍第一个类: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; // forwardpublic: 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/*该元素数据类型*/;};
0 0
- 要想进行二次开发,先进行分析之一:
- 用VC++进行MapX二次开发::之一------地理信息系统概述
- C#进行Visio二次开发
- AutoCAD进行二次开发
- 如何进行ecshop二次开发
- 利用Weka进行二次开发
- 3.1如何进行二次开发
- 使用chanzhi进行二次开发
- 搭建Tigase进行二次开发
- CrashMonkey4Android-如何进行二次开发
- UEditor 如何进行二次开发
- PIXHAWK进行二次开发
- UEditor如何进行二次开发
- 必须先进行初始化
- 先进行一下记录
- 我先对这个天气软件进行需求分析
- 【二次开发】如何使用C#进行CATIA二次开发
- 如何进行ArcIMS的二次开发
- 技巧:Linux 动态库与静态库制作及使用详解
- grunt让Nodejs规范起来
- CSU 1391 Boiling Vegetables
- easyui combotree树
- 卡特兰数及栈出栈顺序问题的相关研究
- 要想进行二次开发,先进行分析之一:
- 使用 Spring Data JPA 简化 JPA 开发
- 快速创建基于npm的nodejs库
- javascript函数querySelector介绍
- Python中flatten用法
- 线性表的链式存储
- Nodejs实现websocket的4种方式
- XML 验证器
- 在线支付设计