很久没有写过博客了,不知道这篇算什么类型的。是技术的,还是心情的呢。
今天终于算是看完了《STL 源码剖析》。写的最后一份代码是 红黑树的实现。
在C++14 的标准看来,这本书有些内容感觉还是过时了。如果有右值引用和匿名函数的话,也许模板还有更牛逼的玩法吧。
我毕业了,学生时代写点什么东西就迫不及待拿出来分享(装逼)的心情反而没有了。
了解到更多的技术,了解到更多的知识,才发觉,真是学无止境。
简单记录一下没有写在博客内后面的内容吧。
关系型容器,有map、 set、 multi_map、 multi_set。这些关系型数据库都是以 红黑树作为底层实现的。
在非C++ 标准之外,还有以hash table 作为底层实现的关系型数据库。
二者的区别,在于 红黑树实现的键值是有序的,而哈希表实现的键值是无序的。
不管实现如何,目的是让容器能够满足在可承受的范围内快速查找元素。
红黑树的实现比较有意思的一点是 ,数据结构的设置。
为了避免各种情况下的边界检查,红黑树有一个头结点,它的left 指向最小元素,right 指向最大元素,parent 指向根节点。
struct rb_node
{
rb_node* left;
rb_node* right;
rb_node* parent;
};
header->left = min_key;
header->right = max_key;
header->parent = root;
当没有根节点的时候,left 和right 都指向它自己。
而STL 的hash table 是以开区间的方式组织数据结构。
但是,它还是设有阈值的,如果元素接近容器的二分之一时,就重新排列元素。
STL 还为标准类型和字符串提供了哈希函数。
这一点还是要注意到的,如果你想为某种类型做哈希时,要提供它的哈希函数。
后面的内容依次是算法、仿函数、迭代器、配接器等。
了解这些,对于设计API 还是有种不一样的感觉。
技术的技能树要怎么点亮,还是有点纠结的。
只是熟悉C++,不够。
语言只是表达逻辑的工具,重要的还是表达的能力,和本身的能力。
往后我想做什么呢。
希望自己在大数据、人工智能、机器学习、图形学、视觉等方面有所拓展吧。