![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 83
斯达克随笔
微信公众号:斯达克随笔
展开
-
聊聊C++ stl_tree
也可以使用其他重载了bool operator()的类,如std::greater,std::greater_equal,std::less_equal,std::not_equal_to,std::equal_to等,不同的比较器会影响节点的排列及顺序,假如使用std::greater为比较器,则tree中左子树比根节点都大,右子树比根节点都小。下面是其示意图和代码。根据local_Rb_tree_decrement中的最后条件,此时需要向上回溯,最后__y是end节点,所以begin的前驱是end。原创 2024-07-24 22:49:21 · 145 阅读 · 0 评论 -
聊聊c++ Hashtable(二)
这里涉及到了hash冲突的避免,当hash函数的分母为质数时,hash的冲突相对会比较小,hash后的数据会分布的更加均匀,所以实际的bucket数量需要是质数,具体要取:最小的大等于期望bucket的质数。这是通过一个常量形式的质数个数来控制的,保存在_S_n_primes中。至此,Hashtable中的关键实现都讲完了,c++标准库中的unordered_set、unordered_map、unordered_multiset、unordered_multimap都是基于Hashtable实现的。原创 2024-07-19 23:16:53 · 127 阅读 · 0 评论 -
聊聊c++ string
首先看看string的主要数据结构:如下图所示,其内部是一块连续的内存空间(就叫它缓冲区),每个string内部都有一个数据指针dataplus,其指向数据区的开始,即下图中蓝色开头。每当修改某个string对象时,重新分配空间并拷贝原有数据,在新的空间上进行修改,同时释放之前的空间,refcount减1,当refcount小于等于0时,释放Rep所指向的空间。可以看到,两个string的内部数据指针一样,可见string的赋值是所谓的浅拷贝,那么为什么没崩溃呢。先看个简单的示例,来看下实际运行结果。原创 2024-07-19 23:19:20 · 275 阅读 · 0 评论 -
聊聊C++ array
可以使用C++的容器:array。它内部也是一个分配在栈上的数组,并且支持赋值、求大小、随机访问等,当然,数组不能过大,毕竟线程栈是有大小限制的。C++并没有限制你如何去使用它,给了你自由的同时,也不会保证程序的结果符合预期,如果不是遗留代码,不涉及传参、赋值,并且数组大小不大的话,能用array还是尽量使用array吧。可以看到,在printArrSize函数中,打印的数组大小为8,而不是10。可以看到结果符合预期。array的实现比较简单,就是一个栈上数组,放一张图,贴一点关键代码,其他就不再细说了。原创 2024-07-19 23:06:18 · 102 阅读 · 0 评论