咱们这里还是跟Map和Set的封装一样的道理,没有必要为了unordered_map和unordered_set传的参数不同就实例化两份代码,可以直接通过模板参数来解决。那么unordered_map传的是pair<key,value>,unordered_set传的是key。对于哈希表还有不懂的可以去看上一篇博客(http://t.csdnimg.cn/O5Vg5),对Map和Set封装还有不懂的可以去看博客(http://t.csdnimg.cn/dOSOt)。
所以咱们的代码改造成:
到此时我们还没有出现新的东西,一切都是在《Map和Set的封装》和《哈希开散列的实现》两个基础上结合起来的。而对迭代器的封装也是如此。
我们还是采用之前的模板参数来实现,需要注意的是,由于迭代器里面要用到自定义类HashTable,而由于HashTable 我把他排版在了迭代器的下面,所以我们要先在迭代器的前面申明这个类存在,因为编译器只会向上兼容,这也是一个可以借鉴的点。而我们自定义类HashTable里面也要用到迭代器,那么反过来迭代器在类的上方,可以向上兼容,所以不用在类的前面申明了。
特别注意的是:
那么类HashTable中设置友元具体是:
此处迭代器里面值得一讲的是++操作(因为哈希表开散列的结构是单链表,所以没有必要实现--操作),我们得分情况来看,如果这个元素之后在用一个桶中还有元素,那么直接++就行;如果没有,则要依次向后找,找到下一个不为空的桶开始遍历。
那么我们哈希表的整体代码就是:
注意:由于迭代器的构造要用到HashTable,所以在HashTable类中插入操作的时候,用this返回哈希表。
那么到此时,unordered_set的具体实现已经很清楚了。这里我们要知道unordered_set里面的元素key是不能被改变的,所以为其附上const的枷锁。
同样,unordered_map的具体实现已经很清楚了。这里我们要知道unordered_map的pair<key,value>里的key是不能被改变的,所以也要为其附上const的枷锁。
总结
好了,到这里今天的知识就讲完了,大家有错误一点要在评论指出,我怕我一人搁这瞎bb,没人告诉我错误就寄了。
祝大家越来越好,不用关注我(疯狂暗示)