- 博客(29)
- 收藏
- 关注
原创 封装红黑树模拟实现map和set
map是key/value的搜索场景,set是key的搜索场景,这两个容器的底层,竟然是一致的,这是为什么呢,其实底层的红黑树用了一个巧妙的泛型思想来实现的,红黑树在实现key和key/value的搜索场景时不是写死的,而是由红黑树的第二个模板参数决定结点中存储的数据类型,若红黑树的第二个模板参数传的是key,那就是set的搜索场景,若是键值对,也就是pair<k,v>,那么就是key/value的搜索场景,这样既可以实现key搜索,场景的set,也可以实现key/value场景的map。
2025-03-28 20:35:01
1195
11
原创 C++红黑树实现
红黑树的概念:红黑树是一棵二叉搜索树,他的每个结点增加一个存储位来表示结点的颜色,但颜色只能是红色或者黑色。它是通过约束任何一条从根到叶子结点上的颜色来控制平衡的,这样就会确保没有一条路径会比其他路径长出两倍,因而红黑树接近平衡结点颜色只能是红色或者黑色根结点必须是黑色若一个结点是红色,那么它左右孩子的结点只能是黑色,换句话说就是,不能有连续的红色结点(注:若红色结点的孩子结点为空,那么该“空叶子结点”也是黑色的对于任意一个结点,从该结点到其他所有空结点的简单路径上,均包含相同数量的黑色结点。
2025-03-23 11:17:42
1208
13
原创 C++异常
上面的代码分析,当调用func函数,输入值,然后调用Divide函数,若b为0时,就会抛出一个异常,上述代码中抛出是一个string对象,那由哪个catch来捕获呢,是Divide函数中的catch来捕获吗,不是的,根据C++的捕获规则,是由与抛出对象类型匹配以及是离抛出异常位置最近的catch来捕获,那么上面的代码中,符合规则的只有main函数中的catch。重新抛出异常,有时候不是为了对异常进行处理,可能是先捕获下来,对一些开辟的空间进行释放,或者特殊的情况先进行处理,处理完之后再重新抛出异常。
2025-03-17 10:17:30
773
10
原创 map和set的使用
set是一个关联式容器,关联式容器逻辑结构通常是非线性结构,两个位置之间右紧密的联系,交换一下,它的存储结构就被破坏。set的底层是红黑树,红黑是是一棵平衡的二叉搜索树,set是key搜索场景的结构set声明的结构如下图:第一个模板参数为关键字的类型,也就是key的类型第二个模板参数是仿函数,用来控制关键字的比较方式,这里默认支持小于的比较方式,若不满足自己的需求,可自己实现一个仿函数。
2025-03-04 14:23:42
1324
8
原创 继承
概念:继承是面向对象的三大特性之一。继承在现实生活中的说法就是继承了家里的家产,继承了家里的家业,从长辈那直接得到,而在C++中则是解决一些复用的问题,内层次的复用,它允许我们在保持原有类特性的基础上进行拓展,增加一些成员变量或成员函数,产生新的类,该种类就叫派生类。一句概括就是继承是类设计层次的复用。
2024-12-10 16:53:08
1149
11
原创 #C 函数递归
这个例子其实是一个错误的示范,会导致这个函数无限递归下去,无限递归会出现栈溢出的错误,因为每一次调用函数,都要为这一次函数的调用分配内存空间,二内存的空间是在栈区上分配的,所以会出现栈溢出(stack overflow)的错误。上面的图片清楚的展示函数是如何将递归的,就是将实数不断的递推出去,然后将返回值不断的归回来,最后得出最终的返回值。函数递归一定要满足上述两个条件,没有条件就会出现栈溢出,空间不足的错误,就如我上面举到的例子。它的递归条件就是当n=0时,停止对函数的调用,返回值为1.
2024-04-27 20:37:52
367
原创 c# 循环结构 break和continue的用法
从这个代码可以说明,当i为4时if条件为真,执行break语句,而printf语句和i++语句将不会执行,且while循环体终止,输出的结果就为1 2 3,这个语句相对来说也是很好理解的,其实break翻译过来也就是"打断"的意思嘛,打断两人之间的对话,打断循环体,是一个非常常用的语句。首先,1赋值给了i所以满足i<=5的表达式所以为真,i为1被打印了出来,之后i++使i=2又满足表达式2<5,i为2被打印了出来,以此类推,直到i>5,表达式为假,结束了循环。break的作用就是终止循环,直接跳出循环体。
2024-04-14 12:06:38
905
原创 C# 分支结构
通俗的来讲,表达式就相当于一把可以变换数字的钥匙,case1和case2还有default就相当于门,如果钥匙变化成了数字1这把钥匙就可以开case1的门,如果不是数字1也不是数字2这把钥匙就可以开default的门,这些门就相当于多个结果。当然case的个数是由问题本身决定的,可以有很多个,defualt可以有也可以没有,也是根据问题来决定的。需要注意的是,switch后面的表达式必须是整型的,case后面必须是整型常量。当i%3为1时,程序就会自动跳到case为1的语句中,输出余数是1。
2024-04-14 12:05:38
316
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人