![](https://img-blog.csdnimg.cn/20200612103637402.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C/C++相关
各种C/C++相关知识点,你想要的这里都有
xiaofenzhao
这个作者很懒,什么都没留下…
展开
-
单例模式(饿汉+懒汉)详细代码
单例模式:单例模式有两种实现方式:饿汉模式:就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象class Singleton{public:static Singleton* GetInstance(){ return &m_instance;}private:// 构造函数私有 Singleton(){};// C++98 防拷贝 Singleton(Singleton const&); Singleton& operator=(Singlet原创 2020-06-12 11:23:55 · 678 阅读 · 0 评论 -
8大排序算法(超详细,算法步骤+代码)
排序的分类按照排序过程中所依据的原则的不同可以分类为:►插入排序:直接插入排序 希尔排序►交换排序:冒泡排序 快速排序►选择排序:简单选择排序 堆排序►归并排序►基数排序排序算法比较从平均情况看:堆排序、归并排序、快速排序胜过希尔排序。从最好情况看:冒泡排序和直接插入排序更胜一筹。从最差情况看:堆排序和归并排序强过快速排序。虽然直接插入排序和冒泡排序速度比较慢,但是当初始序列整体或局部有序是,这两种算法的效率比较高。当初始序列整体或局部有序时,快速排序算法效率会下降。当排.原创 2020-06-12 11:19:42 · 2405 阅读 · 1 评论 -
C语言操作符总结
《C语言操作符总结》1.算数操作符( + - * / %)(1)加减不用说啦,其实在“-”执行的也是“+”(2) “%”的两个操作数必须是整数,返回的是整除之后的余数(3)“/”的两个操作数只要有一个是浮点数,则执行的就是浮点数除法2.移位操作符移位规则: 左移<<: 左边抛弃,右边补0右移>>:分为逻辑右移和算数右移逻辑右移:左边补...原创 2019-03-05 10:36:49 · 177 阅读 · 0 评论 -
今天你面向对象了吗?(C++初识)
命名空间:1、如同局部作用域和全局作用域一样,都是一个作用域,解决命名冲突的问题。2、命名空间可以嵌套定义也可以分块定义,编译器会将相同的命名空间进行合并。这里介绍一下作用域限定符::(如果是全局的话就不用加)命名空间 中成员的访问方式:1、命名空间+作用域限定符::成员名字2、using+命名空间+作用域限定符::成员(相当于把它展开成全局形式)3、using+namespace+...原创 2019-04-27 17:43:30 · 109 阅读 · 0 评论 -
c++初识(2)
引用:一个 人可以有不同的名字,可以有不用的外号。(给变量起一个别名,指向一个实体不给它开辟空间)类型&int & ra = a ra是a的一个别名const int a=10;const int& ra=a;const int& r1=10(临时变量不能被改变)交换:swap(int&a,int &...原创 2019-04-28 15:38:10 · 71 阅读 · 0 评论 -
链表的基本操作(增删改查)超详细
什么是链表?链表是一种物理存储上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现的。就好比是班里的同学的学号、每个同学上课所坐的位置坑都不是固定的,但是通过他们之间学号的连续性,通过1号可以找到2号同学,链表就是这样,不仅存储了数值,还存储着下一个元素的地址链表的基本操作有:初始化、销毁、增、删、改、查首先给出链表结构体:typedef struct Node{...原创 2019-05-02 11:28:08 · 3895 阅读 · 0 评论 -
链表相关面试题(详细注释)LeetCode亲测无误
1、合并两个有序链表/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode*...原创 2019-05-03 13:03:02 · 100 阅读 · 0 评论 -
快慢指针及其应用(详细注释,适合程序小白)
什么是快慢指针?形象的说,如上图所示,假设有两个小人,分别以2m/s和1m/s的速度,在赛道上奔跑,那么当黄色小人到达终点的时候,蓝色小人正好在中间的位置。不考虑其他因素的影响,那么黄色小人就是快指针,蓝色小人就是慢指针。那么快慢指针究竟有什么作用呢?来看一道题。给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入...原创 2019-05-03 13:21:09 · 439 阅读 · 0 评论 -
双指针遍历(输出链表中倒数第k个结点)
题目:输入一个链表,输出该链表中倒数第k个结点。那么这道题该从何入手,其实这道题考察的是双指针遍历,但是这个可不是快慢指针。相当于一个现实中的例子。比如说,两个人同时行走,以相同的速度,但是甲在乙前方5m处,那么当甲走到终点的时候,乙在哪,当然是在甲后方5m处。过度到题目中来,如果让前指针先走k步,那么当它走到终点的时候,乙在哪,是不是刚好在倒数第5个的位置。如果你还不明白的话,可以参考下图。...原创 2019-05-03 14:22:33 · 267 阅读 · 0 评论 -
删除链表中的重复结点(牛客网亲测无误)
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 ListNode* deleteDuplication(ListNode* pHead) { if(pHead==NULL) { ...原创 2019-05-03 15:56:56 · 155 阅读 · 0 评论 -
相交链表(详细步骤--解题思路)
题目描述:编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8...原创 2019-05-03 17:38:37 · 334 阅读 · 0 评论 -
c语言求字符串的长度(strlen)
说到字符串这个老铁啊,它有一个明显的特征,就是以‘\0’结尾。那么如果要求它的长度,就可以利用这个特性。 下面贴出它的代码实现:(此处代码可正确运行,但是并不是最终结果哦,最终结果后面给出)#include<stdio.h>#include<stdlib.h>#include<assert.h>size_t My_Strlen(cons...原创 2019-05-07 19:58:31 · 2363 阅读 · 0 评论 -
c语言字符串拷贝(strcpy)
字符串拷贝就是将一个字符串拷贝到另一个字符串中。因此需要定义两个字符串:char* des和char* src,其中dest是目的字符串,src是源字符串。那,这是什么意思呢?举个栗子。。大家都看过西游记吧,简直是小编我的童年好吗。(hhh)。那么小伙伴们知道唐僧最爱说的一句话是什么吗???------》(贫僧是从东土大唐而来去往西天拜佛求经)是不是勾起了你的某些回忆(hhh)。这句话带给我...原创 2019-05-07 21:36:53 · 3677 阅读 · 0 评论 -
复杂链表的复制(带随机结点)
题目描述:给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。深拷贝:深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一 个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。(来自百度百科)所以说,拷贝完不...原创 2019-05-08 15:49:35 · 147 阅读 · 0 评论 -
栈实现队列(leetcode亲测)
关于栈和队列的概念,相信大家都已经知道了,我这里就不在赘述了,如果还有不明白的小伙伴们可以看看我的上一篇博客,里边有介绍哦。如何用栈实现队列呢?当然一个栈是不够的,请看下图:定义两个栈,左边的栈为压入栈,首先数据进入到左边的栈,然后再将数据弹出压入到右边的栈,在将右边的栈中元素弹出,这样就达到了栈的 功能。下边贴出代码:class MyQueue {public: stack&...原创 2019-05-08 16:48:16 · 151 阅读 · 0 评论 -
最小栈的实现
什么是最小栈?就是说,把一组数据压入栈后,每次弹出的都是栈中最小的那个数据。怎么实现呢?思路:可以用两个栈实现,一个栈中压入数据,然后把最小的数据存放在另外一个栈中入下图所示。其中需要用到的函数接口如上图左边所示。数据压入左栈后,如果右栈中此时没有数据,直接把左栈中的数弹出后再压入到右栈。再次压入右栈的数据就需要跟栈顶的的元素大小进行比较,如果小于等于栈顶元素时才压入,,这样出栈的时...原创 2019-05-09 13:13:09 · 133 阅读 · 0 评论 -
循环队列的实现
所谓循环队列,就是可以不断地往进存数据,我们首先想到的可能是数组实现,但是其实是其实使用数组是存在问题的,下面请看下图。首先如果数组下标由0-4的位置都存了数据,现在把0-3位置的数据移出去,那么下次存入数据时,肯定是从下标为4的下一个位置开始存数据,这样就造成了空间的大量浪费。且front和rear指针并不能判断当前数组是否为空还是满了。所以,引用容量和大小来进行判定,如果size0,当前...原创 2019-05-09 13:36:02 · 148 阅读 · 0 评论 -
二叉树的前序、中序、后序(相关面试题)
二叉树代码的核心是递归算法。递归算法1、需要终止条件2、需要递推公式二叉树的遍历有3种形式,前序、中序、后序前序:根–》左–》右中序:左–》根–》右后序:左–》右–》根代码很简单这里就不贴了,有需要的小伙伴评论下留言哦下面说下二叉树相关题目1、求结点个数代码如下int countNodes(TreeNode* root) { if(root==NULL) ...原创 2019-05-09 14:28:49 · 830 阅读 · 0 评论 -
c++类和对象(初级)
类:就是类别,它是一个抽象的概念,是一种事物的总称对象:经过实例化后就是对象struct和class的区别类的关键字是class,class与c语言中我们学的struct结构体差不多。但是他们也是有区别的1、struct结构体中只能定义变量类型,而class类中不仅可以定义变量(对象)也可以定义函数。2、对于访问权限来说,在struct结构体中定义的变量是公有的,结构体外部的也可以访问,...原创 2019-05-13 20:41:56 · 68 阅读 · 0 评论 -
c++类和对象(中)
类的6个默认成员函数:分3类:1、初始化和清理构造函数:主要完成初始化操作与类名相同没有返回值可以有多个重载构造函数会自动调用自定义成员的默认构造函数初始化自定义成员全缺省相当于无参,都是默认构造函数(只能用其中的一个)析构函数:~类名()清理但是不销毁,无返回值无参数,只有一个在不可重载2、拷贝复制3、取地址重载...原创 2019-05-21 11:22:47 · 48 阅读 · 0 评论 -
static的用法
static:可修饰成员变量和成员函数1、当修饰成员变量时a.存放在静态数据区,所有对象共享,全局只有一个,可以看成是类成员b.静态成员必须在类外定义由于类内的成员变量一般为私有的,而static修饰的成员变量,是要提供给全局使用的,否则就失去了它的意义c.可以把静态成员看成是类成员d.访问方式类名::成员通过对象访问2、当修饰成员函数时a.可以通过类名访问b.也可以通过对...原创 2019-05-21 11:40:54 · 86 阅读 · 0 评论 -
类和对象(下篇)
1、再谈构造函数在类和对象(上篇)中,我们已经介绍了构造函数,所谓构和造函数就是完成初始化功能的函数。虽然构造函数在被调用之后,对象中已经赋了一个值,但是不能将其称为对象的初始化,因为初始化只有一次,而赋值可以有多次。a. 初始化列表:就是成员变量定义的地方,,初始化成员变量。b. 形式:构造函数():成员(值/初始化表达式),成员{}c. 每个成员变量在初始化列表中只能初始化一次...原创 2019-05-28 14:53:11 · 70 阅读 · 0 评论 -
C/C++内存管理
1、关于代码中的数据存放在哪里的问题1)只要是全局变量和静态变量都存放在数据段2)局部变量存放在栈上,但是局部变量存储的内容是存放在代码段的3)如果有malloc等的这些动态空间开辟的,变量存放在栈上,但是开辟出来的内容 存放在堆上2、malloc/calloc/realloc...原创 2019-05-30 09:24:10 · 114 阅读 · 0 评论 -
c++内存管理常见面试题
1、malloc/free和new/delete的区别malloc和free和new/delete的共同点是:都是从堆上申请空间的,并且需要用户手动释放。不同点:1、malloc和free是函数,new和delete是操作符2、malloc申请的 空间不会被初始化,new可以初始化3、malloc申请空间时,需要手动计算空间大小并传递,new只需在后跟上空间的类型即可4、malloc返...原创 2019-05-30 10:48:18 · 416 阅读 · 0 评论 -
string类
1、什么是string 类c语言中,字符串是以‘\0’结尾的一些字符的集合,字符串在平时应用十分广泛,因此c++中提供一种可以有更多 的功能的字符串,就是字符串类2、string类的常用接口1)string类的对象的常见构造string() :构造空的string类对象,即空字符串string(const char* s):用c-string来构造string类对象string(siz...原创 2019-05-30 21:20:11 · 105 阅读 · 0 评论 -
深拷贝、浅拷贝
深拷贝:称为位拷贝,编译器只是将对象中的值拷贝过来,如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉...原创 2019-05-31 12:48:59 · 66 阅读 · 0 评论 -
List的介绍和使用
list的介绍:1.list在底层是一个双向带头的链表。2.list可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。3、list可以在任意位置进行插入和删除,不需要遍历,执行效率高。list的使用:list构造://list的构造//int main()//{// list<int> l1;//构造空的l1// list<in...原创 2019-06-03 20:09:35 · 140 阅读 · 0 评论 -
多态
多态:顾名思义,就是多种形态,在继承体系中,子类需要有自己的表现形态实现多态的前提:1、实现继承2、是虚函数3、调用的函数必须是引用或指针虚函数的覆写函数为虚函数,子类有相同的函数,和父类的函数名相同,参数也相同,返回值类型也相同(接口完全相同)。例外:协变:返回值类型可以是继承关系三者区别:函数重载:同一个作用域下,函数名相同,参数不同函数隐藏:继承体系中,子类和父类的函数名相...原创 2019-06-28 21:20:18 · 49 阅读 · 0 评论 -
vector介绍及使用
1.vector的介绍1)vector是可以表示可变大小数组的序列容器2)vector采用的连续存储空间来存储元素,如同数组一样,因此也可以用下标对vector中的元素进行访问。3)本质上,vector使用动态分配数组来存储它的元素,当新元素插入时,这个数组需要重新分配大小,为了增加存储空间,分配一个新的数组,然后将全部元素移到这个数组。4)vector分配空间策略:vector会分配一些...原创 2019-07-26 15:56:52 · 507 阅读 · 0 评论 -
stack和queue的使用
stack的介绍及使用1.stack是一种容器适配器,专门用在具有先进后出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(栈顶)被压入和弹出。3.stack的底层容器可以使任何标准的容器类模板或者一些其他特定的容...原创 2019-07-27 15:17:48 · 149 阅读 · 0 评论 -
模板初阶
对于编译器而言,编译器不对模板本身进行检查,会对实例化后的代码进行检查。函数模板;模板的匹配原则:有现成的就用现成的(现在人的思维)没有现成的就用模板,如果非要用模板,就用显示定义的方法。类模板:...原创 2019-07-28 11:52:09 · 64 阅读 · 0 评论 -
模板进阶
1.非类型模板参数模板参数分类类型形参和非类型形参类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用注意:1.浮点数、类对象以及字符串是不允许作为非类型模板参数的2.非类型的模板必须在编译期就能确认结果2.模板的特化通常情况下,使用模板可以实现一些与...原创 2019-07-29 13:05:17 · 163 阅读 · 0 评论 -
c++异常
1.c语言传统的处理错误的方式1)终止程序,如assert,缺陷:用户难以接受,如发生错误,除0错误时就会终止程序。2)返回错误码,缺陷:需要程序员去查找对应的错误,如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误2 c++异常概念异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误throw:当问题出现时,...原创 2019-08-04 13:17:09 · 74 阅读 · 0 评论 -
c++智能指针
异常安全:如果在malloc和free之间如果存在抛异常,还是会有内存泄漏问题,这种问题就叫做异常安全。智能指针的使用及原理:RAIIRAII:是一种利用对象的生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等)的技术在对象构造时获取资源,接着控制资源的访问,使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源,实际上是把管理资源的责任托管给了一个对象,我们可以把这...原创 2019-08-07 15:08:46 · 71 阅读 · 0 评论 -
c++类型转换
1.c语言中的类型转换我们知道c语言中的类型转换包括隐式类型转换和强制类型转换,如下:void Test() { int i = 0; double d = i;//隐式类型转换 printf("%d,%.2f", i, d); int* p = &i; int address = (int)p;//强制类型转换 printf("%x,%d\n", p, address);...原创 2019-08-07 17:28:38 · 64 阅读 · 0 评论 -
c++红黑树
什么是红黑树?也是一种二叉搜索树,但是每个结点上增加一个存储位表示结点的颜色,可以是RED或BLACK,它是接近平衡的红黑树的性质也是很关键的1)每个结点不是红的就是黑的2)每条路径上黑色的数量必须相等3)根结点必须是黑的4)两个红色的不能连续5)每个叶子结点都是黑的(指的是空节点)思考题1在节点的定义中,为什么要将节点的默认颜色给成红色的?答:因为要保证每条路径上黑色结点数目...原创 2020-06-12 10:53:05 · 83 阅读 · 0 评论 -
c++位图-布隆
说起位图和布隆,也是一把辛酸泪了。毕竟智商受限啊,今天研究了一下午,终于明白了些许,赶紧整理起来。什么是位图:1) 其实它也是一种哈希表,只不过它是以位(bit)为单位的,我们平常都是以字节(也是内存中可操作的最小单位)·相当于一个二维数组,一维相当于是字节,二维就要定义到位了假设是用int来说,一个int是4个字节,一个字节是8位,因此一个整型就是32位。那么我们要定义到一个具体的位应该怎...原创 2019-08-24 20:07:58 · 87 阅读 · 0 评论 -
用两个栈实现一个队列(c++)
从今天开始正式进入撸题之旅啊,想想不免觉得头有点疼,不过没办法啊,下次找工作就轮到我了,希望与各位小伙伴们互相激励把。本人比较low,欢迎指点迷津。用两个栈实现一个队列,其实思路比较容易,首先我们需要知道栈和队列的特性。栈:先进后出队列:先进先出用一幅图来看就比较明显了绿色的表示栈1,红色的表示栈2现在我们来看,如果将要进栈的数据是abc,如果是一个栈的话那么出栈的顺序肯定就是cba...原创 2019-12-12 15:47:39 · 244 阅读 · 0 评论