![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 92
道_可
待到来年花开,依旧
展开
-
哈希表以及哈希表的底层结构 --- 万字解说【c++11】
-(常用)取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B优点:简单、均匀缺点:需要事先知道关键字的分布情况使用场景:适合查找比较小且连续的情况。原创 2024-03-29 16:42:53 · 593 阅读 · 0 评论 -
数据结构中的平衡搜索树 --- 红黑树 (如何旋转与变色)
红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O($log_2 N$),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。这时会发现违反性质3比违反性质4的代价要更小,而事实上也的确是这样做的,可能会有疑问,这样还是红黑树嘛,其实新增节点之后是需要通过变色来达到红黑树的结构的。此时我们会发现,最后的结构是符合红黑树的:没有出现连续的红色节点;原创 2024-03-13 15:43:42 · 743 阅读 · 0 评论 -
数据结构中的平衡搜索树 --- AVL树是怎样进行旋转处理的?(平衡因子版本)
树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。):第一次单旋会把30节点 、60节点 的平衡因子置成 0,第二次单旋会把60节点 、90节点 的平衡因子置成 0 ,这显然是不对的,因为90节点最后的平衡因子应该是1。因为AVL树也是二叉搜索树,可按照二叉搜索树的方式将节点删除,然后再更新平衡因子,只不错与删除不同的时,删除节点后的平衡因子更新,最差情况下一直要调整到根节点的位置。什么时候右旋,什么时候双旋呢?原创 2024-03-12 17:49:09 · 636 阅读 · 0 评论 -
二叉搜索树 - c++实现
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。b、最多查找高度次,走到到空,还没找到,这个值不存在。,统计成功后,给定单词就可快速找到其出现的次数,原创 2024-01-22 15:09:40 · 808 阅读 · 0 评论 -
关于c++的三大特性 --- 多态(底层原理)
建议看下面的内容之前,先看一下这里我们先来看一个笔试题:请问 sizeof(Base)是多少?为什么呢?按照内存对齐的规则,这里应该是4byte,为什么是8byte呢?调试一下:通过观察测试我们发现,。一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表。原创 2024-01-19 13:01:02 · 815 阅读 · 0 评论 -
c++三大特性之多态
从上面可以看出,C++对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的,只有在程序运行时没有得到预期结果才来debug会得不偿失,因此:C++11提供了。),所以就算是子类不加 virtual 关键字,也认为是虚函数,因为父类就是虚函数,子类继承也是虚函数,当然,也可以认为是个例外。,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。但是在这个地方,我们认为子类重写了这个虚函数,重写体现的是。原创 2024-01-09 16:58:40 · 843 阅读 · 0 评论 -
c++的三大特性之关于继承
Person是父类,也称作基类。Student是子类,也称作派生类。原创 2024-01-03 20:33:51 · 826 阅读 · 0 评论 -
c++ - 模板特化
模板特化中分为与。注意:以下示例均已日期类为例函数模板的特化步骤:1.必须要先有一个基础的函数模板2.关键字template后面接一对空的尖括号3.函数名后跟一对尖括号,尖括号中指定需要特化的类型4.函数形参表必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。该种实现简单明了,代码的可读性高,容易书写,因为对于一些参数类型复杂的函数模板,特化时特别给出,因此函数模板不建议特化。原创 2023-12-28 22:27:49 · 411 阅读 · 0 评论 -
关于标准库中的反向迭代器
迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如list或vector)上遍历访问的接口,通常来说就是访问容器(数据结构中保存)的元素。并且迭代器是分类型的,STL中的名字是类型的暗示(比如Inputiterator),迭代器的使用属性是正向访问以及反向访问;还有特性属性,严格来说还分单向双向随机,单链表的迭代器特性就是一个单向的,它只能++,不能--,双向链表的迭代器特性就是双向的,不仅能++,还能--。原创 2023-12-25 14:31:25 · 892 阅读 · 0 评论 -
关于标准库中的 stack / queue / 优先级队列(涉及部分仿函数,deque)
双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。原创 2023-12-24 12:51:47 · 712 阅读 · 0 评论 -
关于标准库中的list(涉及STL的精华-迭代器的底层)
因为这里的const修饰的是*this 也就是指向的内容,*this 是这个节点的指针,const修饰的是这个指针的本身不能被改变,也就是_head不能被改变,但是可以拷贝。所以回过头来也能发现,c++新增运算符重载,而不是继续使用printf函数,是因为printf函数有局限性,printf只能打印内置类型,%d,%lf等等。其次,关于下面这句代码,我们并没有实现拷贝构造,编译器会默认生成,默认生成的拷贝构造是浅拷贝,那么,这里可以使用浅拷贝嘛?这里不仅可读,并且可写,显然程序是有些不正确的。原创 2023-12-13 15:40:16 · 1057 阅读 · 0 评论 -
关于标准库中的string类 - c++
流提取并未在输入中获取字符,而是在缓冲区获取字符,而空格或者换行未进入缓冲区,c++/c 规定,值与值之间的区分必须是空格或者换行,所以输入空格或者换行会被认为是多个字符之间的间隔,不会被cin 或者 scanf 拿到。答:因为_capacity是容量字符,指的是能够存取多少个有效字符,而vs认为 '\0'属于标识符,不属于有效字符的范畴,所以+1是为了给'\0'预留空间。的时候,会导致缩容的问题,对程序的安全造成隐患,因此要加个判断,避免出现缩容的情况。操作时,如果能够大概预估到放多少字符,可以先通过。原创 2023-11-21 17:55:44 · 493 阅读 · 0 评论 -
c++中的动态内存管理
答:malloc 与 calloc 都是申请内存空间,只不过calloc 会对空间进行初始化,而 realloc 是对已有空间进行扩展。malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new。总结:new 的底层是operator new ,operator new 是 malloc 的封装。基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,原创 2023-10-04 16:02:01 · 248 阅读 · 0 评论 -
(c++)类和对象 下篇
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。,不属于任何类,但需要在类的内部声明,声明时需要加。原创 2023-10-03 11:08:36 · 125 阅读 · 0 评论 -
(c++)类和对象中篇
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如。注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定。关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下,编译器会。无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如。是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务。原创 2023-09-23 13:20:20 · 67 阅读 · 0 评论 -
(c++)类和对象 上篇
将一件事情拆分成不同的对象,靠对象之间的交互完成。为什么说c++是基于面向对象的语言,因为c++不仅可以面向对象,还可以面向过程,算是混编,其次c++要兼容c语言。如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一。原创 2023-09-01 13:29:22 · 136 阅读 · 0 评论 -
c++都补了c语言哪些坑?
中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。c++在形成符号表的时候,会有专门的函数名修饰规则,即使是同一个函数名,参数类型不同,形成的符号表也不会相同。另外如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。注:如果出了函数作用域,返回对象会销毁的话,那么一定不能使用引用返回,要使用传值返回。相对于编译器而言,是寻找的规则。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。原创 2023-08-23 23:40:37 · 4633 阅读 · 0 评论