C/C++
文章平均质量分 88
C/C++详细讲解包括面试题,笔试题,基础知识讲解
_Return_My_Offer_
CSDN官方认证C/C++领域新星创作者 23年CSDN官方成都赛道Top3 玩转C/C++ 数据结构与算法 Linux MySQL 计算机网络 实战项目 蓝桥杯 LeetCode/牛客网刷题 剑指Offer
展开
-
【C++】:手撕红黑树(红黑树的模拟实现)
/ 节点的颜色// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值域// 节点的颜色。原创 2024-04-27 14:13:49 · 880 阅读 · 30 评论 -
【C++】之哈希——unordered系列关联式容器/HashTable的底层结构/HashTable的模拟实现/哈希的应用/基于Hash和位图的海量数据处理面试题
在此文章之前呢 我分享一下我学习C++中的STL源码的心得 最开始学习的是vector和string 这一部分实现起来比较简单 具体可以去看看我前面写的博客 然后就是stack和queue这部分序列式就是所谓的站和队列 这部分我没有以博客的形式呈现出来 具体大家可以去参考一下stack和queue的STL源码 然后就是学的list容器 这部分也比较简单 大家感兴趣可以去看看我写的博客 也是写到了的 然后就是deque双端队列这部分大家可以去参考侯捷老师的STL源码剖析shizhi 我下面也会给大家把图片和原创 2024-03-31 18:05:12 · 1225 阅读 · 41 评论 -
【C++】:STL序列式容器list源码剖析
总的来说:环形双向链表特点:底层是使用链表实现的,支持双向顺序访问在list中任何位置进行插入和删除的速度都很快不支持随机访问,为了访问一个元素,必须遍历整个容器与其他容器相比,额外内存开销大设计目的:令容器在任何位置进行插入和删除都很快何时使用:容器需要不断地在中间插入或删除元素无论删除还是增加,list的迭代器、引用、指针都不会失效。原创 2024-01-19 09:53:53 · 1036 阅读 · 31 评论 -
【C++】:C++中的STL序列式容器vector源码剖析
public://vector的迭代器是原生指标...//等同于int* ivite;//等同于Shape* svite;原创 2024-01-12 20:58:26 · 1287 阅读 · 22 评论 -
【C++】:STL源码剖析之vector类容器的底层模拟实现
如果没有备用空间了,就扩充空间(重新配置、搬移数据、释放原空间)。注意 : 将数据拷贝到新空间,仍然不能用memcpy函数,因为对于需要深拷贝的自定义类型,使用memcpy函数以后,新开辟空间里的元素和原空间里的元素所指向的内存空间是一样的,当旧空间被释放时,会调用自定义类型的析构函数,从而使得新开辟空间里的元素指向的内存空间也被释放掉了。1). 新开辟一块空间,若容器为空,将_start,_finish指向新开辟空间的首元素地址, _endofstorage指向新开辟空间的最后一个元素下一个位置。原创 2023-12-08 16:19:07 · 1849 阅读 · 103 评论 -
【C++】:STL中的string类的增删查改的底层模拟实现
本篇博客仅仅实现存储字符(串)的string同时由于C++string库设计的不合理,我仅实现一些最常见的增删查改接口接下来给出的接口都是基于以下框架:private: char* _str;//思考如何不用const size_t _size; size_t _capacity; //这样写可以 const static size_t string::npos = -1; //下面这种写法也可以->和上述写法产生矛盾 const static size_t str原创 2023-11-22 16:40:44 · 1156 阅读 · 142 评论 -
【C++】:STL——标准模板库介绍 || string类
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。原创 2023-11-14 22:55:02 · 1695 阅读 · 92 评论 -
【C++】:内存管理 || 泛型编程 || 函数模板 || 类模板 || 内存泄漏(后期结合智能指针详讲)
operator new与operator delete函数(重点)new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间_free_dbg。原创 2023-11-10 10:19:41 · 394 阅读 · 58 评论 -
【C++】:内存管理:C++内存分布 || C++中动态内存管理(new || delete)
【说明】🃏1. 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的🃏2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)🃏3. 堆用于程序运行时动态内存分配,堆是可以上增长的。🃏4. 数据段–存储全局数据和静态数据。原创 2023-11-08 11:42:04 · 351 阅读 · 79 评论 -
【C++】:类和对象(下):explicit || 再谈构造函数 || static成员 || 友元 || 内部类 || 匿名对象 || 拷贝对象时的编译器优化问题 || 再次理解类和对象
🔫类和对象(下篇)🔫【本节目标】🔫1. 再谈构造函数🔫2. Static成员🔫3. 友元🔫4. 内部类🔫5.匿名对象🔫6.拷贝对象时的一些编译器优化🔫7. 再次理解类和对象。原创 2023-11-03 17:26:02 · 1221 阅读 · 95 评论 -
【C++】:类和对象(中):const成员 || 取地址及const取地址操作符重载
📪将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改🎈🎈这里给大家分享一个文档以及我给大家查到的知识🎈🎈C++委员会已经帮我们写好的C++库 我们只需要写很短小的一截就可以自动识别类型 这是因为函数重载 类型匹配 函数名修饰规则的原因所以我们标准的cout重载应该按照以下的语法规则书写📟输入的语法规则则为📮见下图能否帮助你理解一下🎓下面给大家总结一下🎓运算符重载。原创 2023-11-03 16:00:52 · 801 阅读 · 55 评论 -
【C++】:拷贝构造函数与赋值运算符重载的实例应用之日期类的实现
🔑+=实现的思路就是,实现一个循环,直到天数回到该月的正常天数为止,在循环内部要做的就是进月和进年,让天数不断减去本月天数,直到恢复本月正常天数时,循环结束,返回对象本身即可。🔑-=实现的思路就是,实现一个循环,直到天数变为正数为止,在循环内部要做的就是借月和借年,让天数不断加上上一个月份的天数,直到恢复正数为止,循环结束,返回对象本身。🔑由于日期类的大小比较,均不涉及对自身的改变,对此,我们统一用const来修饰this指针,让其变成const成员函数,减少代码的出错性。🔑前置−−和后置−−重载。原创 2023-10-26 16:30:27 · 2438 阅读 · 104 评论 -
【C++】:类和对象(中)之拷贝构造函数+赋值运算符重载
在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。原创 2023-10-22 21:04:40 · 1597 阅读 · 29 评论 -
【LeetCode刷题】:仅仅反转字母(双指针+字符串)
我们使用 left 指针从左边开始扫描字符串 s,right 指针从右边开始扫描字符串 s如果两个指针都扫描到字母,且 left<right,那么交换 s[left] 和 s[right],然后继续进行扫描;输入:s = “Test1ng-Leet=code-Q!输出:“Qedo1ct-eeLg=ntse-T!输入:s = “a-bC-dEf-ghIj”输出:“j-Ih-gfE-dCba”所有英文字母(小写或大写)位置反转。所有非英文字母保留在原有位置。输入:s = “ab-cd”输出:“dc-ba”原创 2023-10-21 16:00:08 · 178 阅读 · 1 评论 -
【C++】:类和对象(中)之类的默认成员函数——构造函数and析构函数
如果一个类中什么成员都没有,简称为空类空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数由于编译器的优化 我们未给_a赋值 这里是不会报错的这里还需要强调一个点就是成员函数的地址不在对象中成员变量存放在对象中。原创 2023-10-20 20:06:49 · 2050 阅读 · 71 评论 -
【C++】: auto关键字(C++11)+基于范围的for循环(C++11)+指针空值nullptr(C++11)
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得return 10;auto b = a;//auto e;无法通过编译,使用auto定义变量时必须对其进行初始化return 0;原创 2023-10-20 18:59:19 · 261 阅读 · 37 评论 -
【C++】:类和对象(上)+ this指针
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号注意:class默认成员都是私有的(private)class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。原创 2023-10-18 19:24:53 · 1264 阅读 · 74 评论 -
【C++】:引用的概念/引用的特性/常引用/引用的使用场景/传值与传引用的效率比较/引用和指针的区别/内联函数的概念/内联函数的特性
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"类型& 引用变量名(对象名) = 引用实体注意:引用类型必须和引用实体是同种类型的。原创 2023-10-15 19:53:52 · 212 阅读 · 11 评论 -
【数据结构】:二叉树与堆排序的实现
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的节点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的为6。原创 2023-10-14 11:18:15 · 1079 阅读 · 37 评论 -
【数据结构】:队列的实现
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。原创 2023-10-13 21:26:19 · 1473 阅读 · 6 评论 -
【数据结构】:栈的实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶出栈:栈的删除操作叫做出栈。出数据也在栈顶。原创 2023-10-13 21:08:51 · 295 阅读 · 0 评论 -
【C++】:关键字 命名空间 输入输出 缺省参数 函数重载 引用
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员// bit是命名空间的名字,一般开发中是用项目名字做命名空间名// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中2.2 命名空间使用命名空间中成员该如何使用呢?比如:int val;//2. 命名空间可以嵌套int a;int b;int c;int d;原创 2023-10-13 14:54:24 · 102 阅读 · 0 评论 -
从零开始学习C++:C++前言
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而。原创 2023-10-13 14:29:34 · 174 阅读 · 1 评论 -
2023C语言暑假作业day7
以下对C语言函数的有关描述中,正确的有【多选】( )A: 在C语言中,一个函数一般由两个部分组成,它们是函数首部和函数体B: 函数的实参和形参可以是相同的名字C: 在main()中定义的变量都可以在其它被调函数中直接使用D: 在C程序中,函数调用不能出现在表达式语句中答案解析:正确答案:AB主函数中定义的局部变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系,C错误;当函数有返回值时,可以出现在表达式中,D错误。原创 2023-10-12 16:35:23 · 338 阅读 · 1 评论 -
数据结构中常见的排序及代码演示
常见的数据结构中的排序算法有冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序等冒泡排序:比较相邻的元素,如果前一个比后一个大,就交换它们的位置,一轮下来可以将最大的元素放到最后面。时间复杂度为O(n^2)原创 2023-10-11 14:37:18 · 136 阅读 · 1 评论 -
2023C语言暑假作业day6
1、以下叙述中正确的是( )A: 只能在循环体内和switch语句体内使用break语句B: 当break出现在循环体中的switch语句体内时,其作用是跳出该switch语句体,并中止循环体的执行C: continue语句的作用是:在执行完本次循环体中剩余语句后,中止循环D: 在while语句和do-while语句中无法使用continue语句答案解析:正确答案:Abreak语句通常用在循环语句和switch语句中。原创 2023-10-11 14:03:40 · 671 阅读 · 2 评论 -
2023C语言暑假作业day5
如下程序的功能是A: 测字符数组ch的长度B: 将数字字符串ch转换成十进制数C: 将字符数组ch中的小写字母转换成大写D: 将字符数组ch中的大写字母转换成小写答案解析:正确答案:D一个字母对应的大写和小写之间的ASCII码值相差32,而且小写的大于大写的。所以题中’e’和’E’之间的ASCII码值相差32(ch[j]+‘e’-'E’相当于ch[j]+32)。一个字母从大写转化为小写就是在它自身上+32,小写转大写则是-32。原创 2023-07-30 10:56:09 · 369 阅读 · 21 评论 -
【Leetcode刷题(数据结构)】:单向链表
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [ ], val = 1输出:[ ]示例 3:输入:head = [7,7,7,7], val = 7输出:[ ]思路如下见详细代码上述注释掉的代码是我在写的时候犯的错误,大家也可以试着自己写写看会不会和我犯同样的错误。原创 2023-07-30 10:40:06 · 706 阅读 · 19 评论 -
2023C语言暑假作业day4
设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是A: n=0;=‘\n’)n++;B: n=0;=‘\n’)n++;C: for(n=0;getchar()!=‘\n’;n++);D: n=0;ch!=‘\n’;n++);答案解析:正确答案:D对于for循环,其中第一项初始化表达式只执行一次,因此ch只从输入流中取一个字符,之后就再不会取字符,因此会死循环。原创 2023-07-23 22:09:02 · 648 阅读 · 11 评论 -
2023C语言暑假作业day3
已知函数的原型是: int fun(char b[10], inta);,设定义: char c[10];int d;,正确的调用语句是答案解析:正确答案:A参数a是指针,要接收地址,BD错误。参数b可以接收的是char,而&c的类型是char(*)[10],C错误。原创 2023-07-22 22:55:39 · 315 阅读 · 35 评论 -
2023C语言暑假作业day1
执行下面程序,正确的输出是答案解析:正确答案:Cswap函数调用时用的是全局变量,主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系;输出语句这里,考虑局部优先的原则,故选C。原创 2023-07-22 20:14:25 · 187 阅读 · 2 评论 -
2023C语言暑假作业day2
以下程序段的输出结果是A: 12 B: 13 C: 16 D: 以上都不对答案解析:正确答案:A这里考查转义字符,注意:\ 表示字符’‘,\123表示字符’{',\t表示制表符,这些都是一个字符。原创 2023-07-22 16:35:46 · 220 阅读 · 5 评论 -
一篇文章让你搞懂自定义类型——枚举与联合体
enum Day//星期Mon,Tues,Wed,Thur,Fri,Sat,Sunenum Sex//性别MALE,FEMALE,SECRETenum Color//颜色RED,GREEN,BLUE以上定义的 enum Day , enum Sex , enum Color 都是枚举类型{}中的内容是枚举类型的可能取值,也叫 枚举常量这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值enum Color//颜色。原创 2023-07-16 21:43:18 · 305 阅读 · 23 评论 -
一篇文章让你搞懂自定义类型——位段
位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int2.位段的成员名后边有一个冒号和一个数字比如struct Aint _a:2;int _b:5;int _c:10;int _d:30;A就是一个位段类型。那位段A的大小是多少?位段用二进制来表示,47个字节用一个整型来表示不足够,32个字节,所以我就用两个整型来表示,所以打印出来为8。原创 2023-07-15 20:34:51 · 387 阅读 · 10 评论 -
一篇文章让你搞懂自定义类型——结构体
有了结构体类型,那如何定义变量int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化//结构体嵌套初始化// int i;//全局变量 // //struct S //{ // double d;//};//局部变量 // //printf("%c %d\n", sn2.c, sn2.i);原创 2023-07-15 10:22:26 · 436 阅读 · 22 评论 -
一篇文章让你搞懂内存函数
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。库函数memcmp的代码形式看代码1memcmp将arr1中的内容拷贝到arr2中,总共10个元素,每个元素为整型—40个字节通过循环遍历拷贝过后的arr2数组,前十位为拷贝的数数字,后10个元素补0即可对于float类型的memcmp同理1。原创 2023-07-14 21:26:46 · 516 阅读 · 42 评论 -
一篇文章让你搞懂字符函数和字符串函数
库函数strncpy介绍拷贝num个字符从源字符串到目标空间。如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。库函数strncpy代码形式。原创 2023-07-12 00:46:46 · 420 阅读 · 83 评论 -
一篇文章让你搞懂指针笔试题
给定一个数组a,当我们取地址a的时候,我取出的是整个数组的地址,我取地址a+1就指向了数组最后一个元素的后一个位置,这时候我们将&a强制类型转化为int*,因为&a的指针类型本质上应该是int(*)[5],加1之后指针类型不变,当我强制类型转化之后赋给ptr,ptr就指向了元素5后面那个位置,ptr-1向前减1就指向了元素5这个地址,解引用就得到了5,第一个%d理所当然很好理解就是2。原创 2023-07-08 20:29:25 · 494 阅读 · 62 评论 -
一篇文章让你搞懂指针和数组笔试题
sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。原创 2023-07-08 17:29:21 · 466 阅读 · 42 评论 -
一篇文章让你搞懂函数指针数组 指向函数指针数组的指针 回调函数
数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组, 比如整型指针放在一个数组中现在我们要设计一个计算器实现整数的除法,乘法,加法,减法,我们看下面代码如果我把放到下面这段代码后面,逻虽然i解决了case语句冗余的问题,如果case语句有更多的话,冗余现象更明显,解决起来更麻烦,但是代码逻辑上是有问题的行不通的为了解决casey=语句冗余的问题,现在我们就要用到函数指针数组看下面代码对于下面这一行d代码给大家做一下解释。原创 2023-07-07 21:14:30 · 719 阅读 · 75 评论