<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[2301_81568645的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/2301_81568645</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; 2301_81568645]]></copyright><item><title><![CDATA[C++跳过前导空白字符]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/160283129</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/160283129</guid><author>2301_81568645</author><pubDate>Sat, 18 Apr 2026 17:09:33 +0800</pubDate><description><![CDATA[std::ws是 C++ 标准库中一个非常重要的输入操作器（manipulator），专门用于从输入流中提取并丢弃前导空白字符。]]></description><category></category></item><item><title><![CDATA[c/c++指针]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/155428059</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/155428059</guid><author>2301_81568645</author><pubDate>Sun, 30 Nov 2025 23:12:43 +0800</pubDate><description><![CDATA[普通变量：存储一个直接的值（如int a = 10;a存储的就是10指针变量：存储一个内存地址，该地址指向另一个存储单元（如p存储的是a的地址）。：取地址运算符定义：指定指针所指向的数据类型，然后是指针变量的名称，前面加上星号（*）。如：int *p;//指向整型的指针解引用：通过指针访问其指向的地址上的值，使用解引用操作符（*）。int a = 10;// p指向变量a的地址*p = 5;// *p相当于a，等价于a = 5;]]></description><category></category></item><item><title><![CDATA[extern]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/155389976</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/155389976</guid><author>2301_81568645</author><pubDate>Sat, 29 Nov 2025 23:57:33 +0800</pubDate><description><![CDATA[extern核心作用：声明但不定义一个变量或函数。主要用于处理跨文件的变量和函数访问。变量：1.声明外部变量：告诉编译器"这个变量在别的文件中定义，我这里只是使用它"2.不分配内存： 声明不会分配存储空间3.不能初始化显式声明函数具有外部链接性（但通常可省略，因为函数默认就是 ）C++ 的名称修饰： C++ 支持函数重载、命名空间、类等特性。编译器为了在链接时能区分这些同名但参数不同的函数，会对函数名进行“修饰”或“改编”。例如，函数  可能会被编译器改编成  这样的符号。C 的名称修饰： C 语言没有函数]]></description><category></category></item><item><title><![CDATA[linux权限]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/151688658</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/151688658</guid><author>2301_81568645</author><pubDate>Sun, 14 Sep 2025 20:56:50 +0800</pubDate><description><![CDATA[sudo command：如果我们想暂时的对一条命令进行提权：目前我们用adduser新建的用户，没有颁发执行sudo，系统不信任你。5.粘滞位：给目录设置，一般是共享目录，大家可以在目录进行各自文件的增删改查，只允许文件拥有者或者root能删这个文件，其他人一概不允许，t是一种特殊的x权限！你的共享目录，共享体现在哪里呢？Linux中所有的用户，都要有密码，无论是root还是其他，即便是多个普通用户，也都要设置密码。1.普通用户自己的家目录权限是700，我在我的家目录创建的文件，别人都看不到！]]></description><category></category></item><item><title><![CDATA[c++哈希]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/151327723</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/151327723</guid><author>2301_81568645</author><pubDate>Mon, 08 Sep 2025 17:17:08 +0800</pubDate><description><![CDATA[补一个迭代器构造const迭代器的构造函数，因为map实现operator[ ]，要用到insert，而set的迭代器都是const类型的迭代器，哈希表返回的是普通迭代器，所以要写这么一个构造函数。因为map要实现operator [ ]，所以哈希insert返回的是普通迭代器，而set的迭代器是const，所以迭代器要写一个普通迭代器转const迭代器类型。++要遍历哈希表，所以要传哈希表的地址，但又会有迭代器和哈希表互相依赖的关系，所以要声明哈希表。通过数组映射关系来插入，查找，删除数据。]]></description><category></category></item><item><title><![CDATA[红黑树插入的旋转变色]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/148136133</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/148136133</guid><author>2301_81568645</author><pubDate>Thu, 22 May 2025 18:38:26 +0800</pubDate><description><![CDATA[单旋，p为黑色，g为红色,原本违反条件3的即不违反3还保持了黑色节点个数相同，同时也不用向上调整，因为p为根还是黑色，不管p上面的节点是黑色还是红色都不会违反条件3。双旋,c变黑色，g变红色，原本违反条件3的即不违反3还保持了黑色节点个数相同，同时也不用向上调整，因为c为根还是黑色，不管c上面的节点是黑色还是红色都不会违反条件3。原本g为黑色，经过调整g变红色，那么g的前一个节点为红色也违反了条件3，要继续向上调整。g一定为黑色，因为p为红色，条件3不能有连续的红色节点，若g为红色，那就违反条件3。]]></description><category></category></item><item><title><![CDATA[map和set]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147935693</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147935693</guid><author>2301_81568645</author><pubDate>Tue, 13 May 2025 22:47:48 +0800</pubDate><description><![CDATA[这个函数传一个值，返回的是一个类型，类型的面的first存的是大于等于T值的迭代器，second存的值是大于T值的迭代器，一般用来删除多个值的，set去重所以只有一个值，用处不大，但对multiset很有用，用来删除一个有多个数据的值。若是不存在的值，在end之前的返回的区间是[T值的下一个迭代器，T值的下一个迭代器)，也就是一个不存在的区间，若是一个end之后的值，那么区间是[end,end)，也是一个不存在的区间。lower_bound找你要的T值的迭代器的起始位置，找的是>=你要的T值的迭代器。]]></description><category></category></item><item><title><![CDATA[二叉树进阶--二叉搜索树]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147879047</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147879047</guid><author>2301_81568645</author><pubDate>Sun, 11 May 2025 21:01:13 +0800</pubDate><description><![CDATA[因为用_root是this指针里的东西，而this里的_root是不能改变的，改变了就无法找到起始节点，所以用子函数来递归。//为空说明找到要插入的位置了，而root引用的是父亲节点里的指针，改变root就是改变父亲节点里的指针的指向。上面两个是一样的，将删了的元素的孩子给父亲节点（没孩子将nullptr赋过去，有一个孩子将孩子赋过去）//如果cur==_root,说明要删的是开始的节点，改变。//leftMax的左节点，将parent的右节点替换成。//左的话就让parent的左指针接上cur的左指针。]]></description><category></category></item><item><title><![CDATA[c++多态]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147839404</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147839404</guid><author>2301_81568645</author><pubDate>Fri, 09 May 2025 23:17:13 +0800</pubDate><description><![CDATA[上面答案是b，test里调用的this->func()的this是父类指针A*，满足多态的第一个条件，func()子类重写了，满足多态的第二个条件，会调用子类的func()，不过虚函数重写的是函数体，而函数的参数用的函数父类的参数。因为我们要掉的是Derive类型的函数，this要传Derive类型的地址，base1的地址和Derive的地址重叠，传的是正确的，而base2的地址传过去是不正确的，所以经过一系列修正，普通函数的继承是一种实现继承，派生类继承了基类函数，可以使用函数，继承的是函数的实。]]></description><category></category></item><item><title><![CDATA[c++继承]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147838033</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147838033</guid><author>2301_81568645</author><pubDate>Fri, 09 May 2025 21:42:01 +0800</pubDate><description><![CDATA[隐藏/重定义：子类和父类有同名成员，子类的成员隐藏了父类的成员，要访问父类的成员，就加上父类的作用域，(父子类域中，成员函数名相同就构成隐藏)子类拷贝构造不初始化父类的可以吗，不可以，拷贝构造也是构造，若不写初始化父类，会调用父类的默认构造，而不是默认拷贝构造，这样就会出现错误。继承只继承成员变量，不继承函数，因为函数不在类成员里面，在公共区域，但继承的成员变量可以使用基类的函数。可以通过->来操作s里父类的内容。d和d1中存的地址是一样的，因为D类型的结构是一样的，指向a的偏移量是一样的。]]></description><category></category></item><item><title><![CDATA[priority_queue的模拟实现]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147702443</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147702443</guid><author>2301_81568645</author><pubDate>Sun, 04 May 2025 18:48:04 +0800</pubDate><description><![CDATA[可以，但没必要，deque随机访问有不小的计算量，堆对随机访问的要求高，因为要频繁的调整堆。priority_queue的底层是二叉树--堆。向上调整建堆的时间复杂度是O(n*logn)vector<int>改deque行不行？优先级队列，按优先级大的拍，默认是大堆。向下调整建堆的时间复杂度是O(n)// 默认是大堆 -- less。//找左右孩子大的那一个。//仿函数控制实现小堆。//仿函数/函数对象。]]></description><category></category></item><item><title><![CDATA[list的模拟实现]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147546540</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147546540</guid><author>2301_81568645</author><pubDate>Sun, 27 Apr 2025 08:16:09 +0800</pubDate><description><![CDATA[这样返回的是const修饰的引用值，引用值不能被改变，但这样修改又导致没有被const修饰的迭代器无法修改其的值，所以写两个迭代器，但这样写太冗余了，一般都不这样写。新旧迭代器的区别是对const迭代器的适配，旧迭代器也可以适配const，要重新写一个迭代器，但是太冗余了，所以在其基础上做了修改。这是通过类模板实例化出的两个相似的模板类，但是是两个不同的类，可以很好的适配我们的需求，记住只要给不同的模板参数就是不同的类了。//迭代器模拟的是指针，这相当于指针被修饰不能修改，但指针里面的值可以修改。]]></description><category></category></item><item><title><![CDATA[vector的增删查改的模拟实现]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147432131</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147432131</guid><author>2301_81568645</author><pubDate>Tue, 22 Apr 2025 22:05:38 +0800</pubDate><description><![CDATA[当你从新开辟一个空间后，用memcpy拷贝时，你原空间里是自定义类型，而你将自定义类型浅拷贝过去，再调用析构函数将原空间析构掉，而析构时将掉用自定义类型的析构函数，而你新空间里的自定义类型里的指针还是指向原空间里的指针指向的空间，而这块空间已经归还给操作系统了，这样就出问题了。10，1都是int，上面参数是size_t和int，而下面的会是两个int，编译器默认调用更匹配的，所以调用了下面的，而下面的是迭代器类型的构造函数，所以会报错。i++) //修改*********////指向容量的下一个位置。]]></description><category></category></item><item><title><![CDATA[string的增删查改的模拟实现]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147365505</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147365505</guid><author>2301_81568645</author><pubDate>Sun, 20 Apr 2025 14:42:46 +0800</pubDate><description><![CDATA[/和上面差不多，只是在参数不同，上面下面都可以可以自己给自己=，上面是直接不处理，下面重新创一块相同的内容赋值给this，然后tmp将原本在this里相同的内容掉析构处理了。当_size + len <=_capacity时，直接加数据，因为最差_size + len ==_capacity时，容量刚刚好够，//当pos=0时，会导致死循环，因为end是无符号数，当end到-1时，其实是整数的最大值，所以要特殊处理。//end从_size开始是将'\0'带过去了，所以不用补'\0'//容量,不算'\0']]></description><category></category></item><item><title><![CDATA[c++模板初阶]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147109102</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147109102</guid><author>2301_81568645</author><pubDate>Thu, 10 Apr 2025 09:20:44 +0800</pubDate><description><![CDATA[类模板实例化与函数模板实例化不同，类模板实例化需要在类模板名字后跟<>，然后将实例化的类型放在<>中即可，类模板名字不是真正的类，而实例化的结果才是真正的类。template<typename T>或   template<class T> //模板参数--类型。//函数模板根据调用，自己推导模板参数的类型，实例化出对应的函数。//有些函数无法自动推，只能显示实例化。]]></description><category></category></item><item><title><![CDATA[C/C++内存管理]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147109080</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147109080</guid><author>2301_81568645</author><pubDate>Thu, 10 Apr 2025 09:19:29 +0800</pubDate><description><![CDATA[new和delete是用户进行动态内存申请和释放的操作符，operator new 和operator delete是系统提供的全局函数，new在底层调用operator new全局函数来申请空间，delete在底层通过operator delete全局函数来释放空间。6. 申请自定义类型对象时，malloc/free只会开辟空间，不会调用构造函数与析构函数，而new在申请空间后会调用构造函数完成对象的初始化，delete在释放空间前会调用析构函数完成空间中资源的清理。需要下一条智能指针来管理才有保证。]]></description><category></category></item><item><title><![CDATA[c++类和对象中]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147103764</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147103764</guid><author>2301_81568645</author><pubDate>Wed, 09 Apr 2025 21:55:15 +0800</pubDate><description><![CDATA[如果有malloc的值时，浅拷贝时会有两个自定义类型里的指针指向malloc，一种情况当一个销毁后，另一个再销毁就会出错，另一种情况当一个对malloc进行操作时，另一个里没有相应的操作，会有很大的问题。（理解的错误版本：ret接收的是st里的值，当函数结束时，st被释放，里面的malloc被释放，这时ret里的指针是野指针，就是你不操作，当程序结束时也会重新释放malloc造成错误）内部类是一个独立的类，它不属于外部类，更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。]]></description><category></category></item><item><title><![CDATA[类和对象中]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/147103589</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/147103589</guid><author>2301_81568645</author><pubDate>Wed, 09 Apr 2025 21:50:43 +0800</pubDate><description><![CDATA[如果有malloc的值时，浅拷贝时会有两个自定义类型里的指针指向malloc，一种情况当一个销毁后，另一个再销毁就会出错，另一种情况当一个对malloc进行操作时，另一个里没有相应的操作，会有很大的问题。（理解的错误版本：ret接收的是st里的值，当函数结束时，st被释放，里面的malloc被释放，这时ret里的指针是野指针，就是你不操作，当程序结束时也会重新释放malloc造成错误）内部类是一个独立的类，它不属于外部类，更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。]]></description><category></category></item><item><title><![CDATA[c++内联函数]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/146940278</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/146940278</guid><author>2301_81568645</author><pubDate>Wed, 02 Apr 2025 11:46:23 +0800</pubDate><description><![CDATA[以inline修饰的函数叫做内联函数，编译时C++编译器会在调用内联函数的地方展开，没有函数调。因为inline被展开，就没有函数地址。// inline对于编译器仅仅只是一个建议，最终是否成为inline，编译器自己决定。//默认debug模式下，inline不会起作用，否则不方便调试了。1.Func不是inline，合计多少行指令。2.Func是inline，合计多少行指令。inline--函数展开--适用于短小的频繁调用的函数。缺点-- 复杂，容易出错，可读性差，不能调试。]]></description><category></category></item><item><title><![CDATA[c++引用]]></title><link>https://blog.youkuaiyun.com/2301_81568645/article/details/146940223</link><guid>https://blog.youkuaiyun.com/2301_81568645/article/details/146940223</guid><author>2301_81568645</author><pubDate>Wed, 02 Apr 2025 11:45:22 +0800</pubDate><description><![CDATA[引用不是新定义一个变量，而是给已存在变量取了一个别名，编译器不会为引用变量开辟内存空间，它和它引用的变量共用同一块内存空间。出了函数作用域，对象不在了，就不能用引用返回，还在就可以用引用返回。3. 引用在初始化时引用一个实体后，就不能再引用其他实体，而指针可以在任何时候指向任何。注意：如果函数返回时，出了函数作用域，如果返回对象还在(还没还给系统)，则可以使用。int&rii=dd;//不能，a为常变量，值不能改变。//x的值赋给c，c依旧是a/b对象别名。// 引用一旦引用一个实体，再不能引用其他实体。]]></description><category></category></item></channel></rss>