- 博客(29)
- 收藏
- 关注
原创 C++跳过前导空白字符
std::ws是 C++ 标准库中一个非常重要的输入操作器(manipulator),专门用于从输入流中提取并丢弃前导空白字符。
2026-04-18 17:09:33
259
原创 c/c++指针
普通变量:存储一个直接的值(如int a = 10;a存储的就是10指针变量:存储一个内存地址,该地址指向另一个存储单元(如p存储的是a的地址)。:取地址运算符定义:指定指针所指向的数据类型,然后是指针变量的名称,前面加上星号(*)。如:int *p;//指向整型的指针解引用:通过指针访问其指向的地址上的值,使用解引用操作符(*)。int a = 10;// p指向变量a的地址*p = 5;// *p相当于a,等价于a = 5;
2025-11-30 23:12:43
565
原创 extern
extern核心作用:声明但不定义一个变量或函数。主要用于处理跨文件的变量和函数访问。变量:1.声明外部变量:告诉编译器"这个变量在别的文件中定义,我这里只是使用它"2.不分配内存: 声明不会分配存储空间3.不能初始化显式声明函数具有外部链接性(但通常可省略,因为函数默认就是 )C++ 的名称修饰: C++ 支持函数重载、命名空间、类等特性。编译器为了在链接时能区分这些同名但参数不同的函数,会对函数名进行“修饰”或“改编”。例如,函数 可能会被编译器改编成 这样的符号。C 的名称修饰: C 语言没有函数
2025-11-29 23:57:33
309
原创 linux权限
sudo command:如果我们想暂时的对一条命令进行提权:目前我们用adduser新建的用户,没有颁发执行sudo,系统不信任你。5.粘滞位:给目录设置,一般是共享目录,大家可以在目录进行各自文件的增删改查,只允许文件拥有者或者root能删这个文件,其他人一概不允许,t是一种特殊的x权限!你的共享目录,共享体现在哪里呢?Linux中所有的用户,都要有密码,无论是root还是其他,即便是多个普通用户,也都要设置密码。1.普通用户自己的家目录权限是700,我在我的家目录创建的文件,别人都看不到!
2025-09-14 20:56:50
339
原创 c++哈希
补一个迭代器构造const迭代器的构造函数,因为map实现operator[ ],要用到insert,而set的迭代器都是const类型的迭代器,哈希表返回的是普通迭代器,所以要写这么一个构造函数。因为map要实现operator [ ],所以哈希insert返回的是普通迭代器,而set的迭代器是const,所以迭代器要写一个普通迭代器转const迭代器类型。++要遍历哈希表,所以要传哈希表的地址,但又会有迭代器和哈希表互相依赖的关系,所以要声明哈希表。通过数组映射关系来插入,查找,删除数据。
2025-09-08 17:17:08
192
原创 红黑树插入的旋转变色
单旋,p为黑色,g为红色,原本违反条件3的即不违反3还保持了黑色节点个数相同,同时也不用向上调整,因为p为根还是黑色,不管p上面的节点是黑色还是红色都不会违反条件3。双旋,c变黑色,g变红色,原本违反条件3的即不违反3还保持了黑色节点个数相同,同时也不用向上调整,因为c为根还是黑色,不管c上面的节点是黑色还是红色都不会违反条件3。原本g为黑色,经过调整g变红色,那么g的前一个节点为红色也违反了条件3,要继续向上调整。g一定为黑色,因为p为红色,条件3不能有连续的红色节点,若g为红色,那就违反条件3。
2025-05-22 18:38:26
545
原创 map和set
这个函数传一个值,返回的是一个类型,类型的面的first存的是大于等于T值的迭代器,second存的值是大于T值的迭代器,一般用来删除多个值的,set去重所以只有一个值,用处不大,但对multiset很有用,用来删除一个有多个数据的值。若是不存在的值,在end之前的返回的区间是[T值的下一个迭代器,T值的下一个迭代器),也就是一个不存在的区间,若是一个end之后的值,那么区间是[end,end),也是一个不存在的区间。lower_bound找你要的T值的迭代器的起始位置,找的是>=你要的T值的迭代器。
2025-05-13 22:47:48
315
原创 二叉树进阶--二叉搜索树
因为用_root是this指针里的东西,而this里的_root是不能改变的,改变了就无法找到起始节点,所以用子函数来递归。//为空说明找到要插入的位置了,而root引用的是父亲节点里的指针,改变root就是改变父亲节点里的指针的指向。上面两个是一样的,将删了的元素的孩子给父亲节点(没孩子将nullptr赋过去,有一个孩子将孩子赋过去)//如果cur==_root,说明要删的是开始的节点,改变。//leftMax的左节点,将parent的右节点替换成。//左的话就让parent的左指针接上cur的左指针。
2025-05-11 21:01:13
533
原创 c++多态
上面答案是b,test里调用的this->func()的this是父类指针A*,满足多态的第一个条件,func()子类重写了,满足多态的第二个条件,会调用子类的func(),不过虚函数重写的是函数体,而函数的参数用的函数父类的参数。因为我们要掉的是Derive类型的函数,this要传Derive类型的地址,base1的地址和Derive的地址重叠,传的是正确的,而base2的地址传过去是不正确的,所以经过一系列修正,普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实。
2025-05-09 23:17:13
563
原创 c++继承
隐藏/重定义:子类和父类有同名成员,子类的成员隐藏了父类的成员,要访问父类的成员,就加上父类的作用域,(父子类域中,成员函数名相同就构成隐藏)子类拷贝构造不初始化父类的可以吗,不可以,拷贝构造也是构造,若不写初始化父类,会调用父类的默认构造,而不是默认拷贝构造,这样就会出现错误。继承只继承成员变量,不继承函数,因为函数不在类成员里面,在公共区域,但继承的成员变量可以使用基类的函数。可以通过->来操作s里父类的内容。d和d1中存的地址是一样的,因为D类型的结构是一样的,指向a的偏移量是一样的。
2025-05-09 21:42:01
315
原创 priority_queue的模拟实现
可以,但没必要,deque随机访问有不小的计算量,堆对随机访问的要求高,因为要频繁的调整堆。priority_queue的底层是二叉树--堆。向上调整建堆的时间复杂度是O(n*logn)vector<int>改deque行不行?优先级队列,按优先级大的拍,默认是大堆。向下调整建堆的时间复杂度是O(n)// 默认是大堆 -- less。//找左右孩子大的那一个。//仿函数控制实现小堆。//仿函数/函数对象。
2025-05-04 18:48:04
369
原创 list的模拟实现
这样返回的是const修饰的引用值,引用值不能被改变,但这样修改又导致没有被const修饰的迭代器无法修改其的值,所以写两个迭代器,但这样写太冗余了,一般都不这样写。新旧迭代器的区别是对const迭代器的适配,旧迭代器也可以适配const,要重新写一个迭代器,但是太冗余了,所以在其基础上做了修改。这是通过类模板实例化出的两个相似的模板类,但是是两个不同的类,可以很好的适配我们的需求,记住只要给不同的模板参数就是不同的类了。//迭代器模拟的是指针,这相当于指针被修饰不能修改,但指针里面的值可以修改。
2025-04-27 08:16:09
796
原创 vector的增删查改的模拟实现
当你从新开辟一个空间后,用memcpy拷贝时,你原空间里是自定义类型,而你将自定义类型浅拷贝过去,再调用析构函数将原空间析构掉,而析构时将掉用自定义类型的析构函数,而你新空间里的自定义类型里的指针还是指向原空间里的指针指向的空间,而这块空间已经归还给操作系统了,这样就出问题了。10,1都是int,上面参数是size_t和int,而下面的会是两个int,编译器默认调用更匹配的,所以调用了下面的,而下面的是迭代器类型的构造函数,所以会报错。i++) //修改*********////指向容量的下一个位置。
2025-04-22 22:05:38
683
原创 string的增删查改的模拟实现
/和上面差不多,只是在参数不同,上面下面都可以可以自己给自己=,上面是直接不处理,下面重新创一块相同的内容赋值给this,然后tmp将原本在this里相同的内容掉析构处理了。当_size + len <=_capacity时,直接加数据,因为最差_size + len ==_capacity时,容量刚刚好够,//当pos=0时,会导致死循环,因为end是无符号数,当end到-1时,其实是整数的最大值,所以要特殊处理。//end从_size开始是将'\0'带过去了,所以不用补'\0'//容量,不算'\0'
2025-04-20 14:42:46
873
原创 c++模板初阶
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。template<typename T>或 template<class T> //模板参数--类型。//函数模板根据调用,自己推导模板参数的类型,实例化出对应的函数。//有些函数无法自动推,只能显示实例化。
2025-04-10 09:20:44
429
原创 C/C++内存管理
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。需要下一条智能指针来管理才有保证。
2025-04-10 09:19:29
566
原创 c++类和对象中
如果有malloc的值时,浅拷贝时会有两个自定义类型里的指针指向malloc,一种情况当一个销毁后,另一个再销毁就会出错,另一种情况当一个对malloc进行操作时,另一个里没有相应的操作,会有很大的问题。(理解的错误版本:ret接收的是st里的值,当函数结束时,st被释放,里面的malloc被释放,这时ret里的指针是野指针,就是你不操作,当程序结束时也会重新释放malloc造成错误)内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
2025-04-09 21:55:15
725
原创 类和对象中
如果有malloc的值时,浅拷贝时会有两个自定义类型里的指针指向malloc,一种情况当一个销毁后,另一个再销毁就会出错,另一种情况当一个对malloc进行操作时,另一个里没有相应的操作,会有很大的问题。(理解的错误版本:ret接收的是st里的值,当函数结束时,st被释放,里面的malloc被释放,这时ret里的指针是野指针,就是你不操作,当程序结束时也会重新释放malloc造成错误)内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
2025-04-09 21:50:43
584
原创 c++内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调。因为inline被展开,就没有函数地址。// inline对于编译器仅仅只是一个建议,最终是否成为inline,编译器自己决定。//默认debug模式下,inline不会起作用,否则不方便调试了。1.Func不是inline,合计多少行指令。2.Func是inline,合计多少行指令。inline--函数展开--适用于短小的频繁调用的函数。缺点-- 复杂,容易出错,可读性差,不能调试。
2025-04-02 11:46:23
190
原创 c++引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。出了函数作用域,对象不在了,就不能用引用返回,还在就可以用引用返回。3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何。注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用。int&rii=dd;//不能,a为常变量,值不能改变。//x的值赋给c,c依旧是a/b对象别名。// 引用一旦引用一个实体,再不能引用其他实体。
2025-04-02 11:45:22
360
原创 c++函数重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或类型 或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。返回值没要求,若只有返回值不同,不构成重载,会报错。//为什么C语言不支持,Cpp支持重载,CPP怎么支持的呢。因为调用时体现不出返回值,会在编译阶段就报错,到不了链接。//调用歧义,不知道调用的是i还是d。//调用时存在歧义,不知道调用那个。//“f”:对重载函数的调用不明确。//1、是否构成重载--构成。
2025-04-02 11:44:43
290
原创 c++缺省参数
void Func(int a = 10,int b=20,int c=30)//全缺省。void Func(int a = 10,int b=20,int c=30)//全缺省。void Func(int a = 0) <-里面的a=0就是缺省参数。//不能跳着传,祖师爷觉得不好。// 没有传参时,使用参数的默认值。假如函数有多个参数,要从左到右依次传参,不能跳着传。1.半缺省参数必须从右往左依次来给出,不能间隔着给。若定义和声明同时有,定义时不给缺省,声明时给缺省。//传参时,使用指定的实参。
2025-04-02 11:43:52
182
原创 c++命名空间
展开命名空间:下面的namespace bit是定义了命名空间,using namespace bit;问题1:如果变量只存在全局域and命名空间域,那么局部域中对其进行操作,先引用哪一个?()::括号是空白就去全局域中寻找,给了命名空间域会去命名空间去搜索。//会去全局域中寻找。//直接展开会有风险,我们定义如果跟库重名,就报错了。//直接展开会有风险,我们定义如果跟库重名,就报错了。//展开部分: 把常用展开,不常用的std::引用。命名空间解决的是全局的变量,函数,类型的冲突问题。
2025-04-02 11:07:15
381
原创 c数据结构--排序
本来最坏应该是N^2,但是经过前面预排序,数组已经很接近有序了,所以按最好情况算,这里也为N。begin2,end1,end2都有可能越界,begin1不可能越界,因为它=i,i<n。1、cur找到比key小的值,++prev,cur和prev位置的值交换,++cur。prev为界限,prev左边及其本身是比key小的,prev右边是比key大的。//修正路线--如果不全部替换,将会导致tmp中未知数替换到a数组中。////1.gap最后会除到1,1的时候就是直接插入排序。
2025-03-29 15:50:54
411
原创 搜索二叉树
求高度(深度):比较左右节点的的长度,返回长的,关键是要保存左右节点的值,要不然多次查找时间复杂度太高。2.静态局部变量:更不好,只能在局部范围内改变,无法初始化他,如果多次使用必然会将以前的值添加在内。注意:是二叉树的DFS和BFS一般用递归或队列,还有其他的DFS和BFS不一定用递归或队列。求第k层节点个数:k==1时,函数处在k层,记录k层节点的个数。查找:先根,再左,再右,找到返回节点指针,未找到返回NULL。前,中,后序的访问逻辑是一样的,只是访问根的时机不同。BFS:广度优先遍历,一般用队列。
2025-03-28 20:16:40
446
原创 程序环境和预处理
(假定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大些,我们需要一个数组能够大些。vs:每一个源文件(.c)经过编译器(cl.exe)编译后会产生一个目标文件(.obj),多个目标文件再加上链接库经过链接器(link.exe)的处理最终生成我们的可执行程序(.exe)当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。\:续行符,相当于让回车符\n转义成\\n,不再发挥回车的作用。
2025-03-04 22:46:13
949
原创 c文件内容
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,功能:以二进制的形式读文件中的内容到工程中,返回的是成功读取到的元素的个数。
2025-03-04 21:57:09
477
原创 自定义类型:结构体,枚举,联合体
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联。4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整。跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。这些可能取值都是有值的,默认从0开始,依次递增1,当然在定义的时候也可以赋初值。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍.
2025-02-26 18:25:59
759
原创 原码,反码,补码
char和short类型在进行计算的时候,都会先转成int进行计算。unsigned char储存的数是0到255,共256个数,反码:原码的二进制符号位不变,其他位按位取反。大小端字节序指的是数据在电脑上存储的字节顺序。正数的原码,反码,补码都相同(都是原码)。负数的原码,反码,补码是要进行计算的。原码:一个数直接转换成二进制。整数在内存中存储时都是按。补码:反码的二进制+1。大端字节序是把数据的。小端字节序是把数据的。
2025-02-18 17:03:11
309
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅