<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[X__cheng的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/X__cheng</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; X__cheng]]></copyright><item><title><![CDATA[【C++】模板2.0]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/147378217</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/147378217</guid><author>X__cheng</author><pubDate>Mon, 21 Apr 2025 19:02:06 +0800</pubDate><description><![CDATA[上述示 例中，&t2指向的t2显然小于&t1指向的t1对象，但是Less内部并没有比较&t2和&t1指向的对象内 容，而比较的是&t1和&t2本身的值，这就无法达到预期而错误。通常情况下，使用模板可以实现一些与类型无关的代码，但对于一些特殊类型的可能会得到一些 错误的结果，需要特殊处理，比如：实现了一个专门用来进行小于比较的函数模板。模板声明和定义分离到不同文件下，且不在模板定义的位置显示实例化的话，会出现链接错误的原因的话，感兴趣可以自己去查阅哈，我就不介绍了。此时，就需要对模板进行特化。]]></description><category></category></item><item><title><![CDATA[【C++】priority_queue及其模拟实现]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/147366760</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/147366760</guid><author>X__cheng</author><pubDate>Mon, 21 Apr 2025 00:21:57 +0800</pubDate><description><![CDATA[那么优先级队列默认使用vector作为其底层存储数据的容器，在vector上又使用了堆算法将vector中元素构造成堆的结构，因此priority_queue就是堆，所有需要用到堆的位置，都可以考虑使用 priority_queue。当其为大堆的情况下，它的第一个元素总是它所包含的元素中最大的，在堆中可以随时插入元素，并且只能检索最大堆元素(优先级队列中位于顶部的元素)；小堆的情况下，反之。说白了，优先级队列底层是数据结构里面的堆（默认是大堆），也就是说，优先级队列数据的存放必须满足堆的要求。]]></description><category></category></item><item><title><![CDATA[【C++】stack和queue及其模拟实现]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/145702233</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/145702233</guid><author>X__cheng</author><pubDate>Thu, 27 Feb 2025 19:21:54 +0800</pubDate><description><![CDATA[1. 不适合遍历，因为在遍历时，deque的迭代器要频繁的去检测其是否移动到某段小空间的边界，导致效率低下，而序列式场景中，可能需要经常遍历，因此在实际中，需要线性结构时，大多数情况下优先考虑vector和list，deque的应用并不多，而目前能看到的一个应用就是，STL用其作为stack和queue的底层数据结构。均发挥了deque的优点。是一个类模板，有两个模板参数，第二个模板参数有缺省值deque<T>，这是个啥东西我们不用理先，也就是说不必理会第二个模板参数先，先学会stack的使用即可。]]></description><category></category></item><item><title><![CDATA[【C++】list模拟实现]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/144595363</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/144595363</guid><author>X__cheng</author><pubDate>Sat, 21 Dec 2024 21:30:13 +0800</pubDate><description><![CDATA[额额额，浅学了list，老规矩，模拟实现一下list，能让我们更好的理解list。若有兴趣，不妨垂阅！同样的，我不可能把list所有接口都模拟实现出来，我也没有这个能力。So，模拟实现一些简单常用的接口。本工程包括2个文件：mylist.h：用于模拟实现list。test.cpp：用于测试模拟实现的list接口是否达到预期。1.模拟实现list以下代码均放到mylist.h文件中。1.1.list节点由于底层是带头（哨兵位）双向循环链表。]]></description><category></category></item><item><title><![CDATA[【C++】list]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/144518583</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/144518583</guid><author>X__cheng</author><pubDate>Wed, 18 Dec 2024 00:07:25 +0800</pubDate><description><![CDATA[迭代器按功能来划分可以分为：普通正向迭代器（iterator）、普通反向迭代器（reverse_iterator）、const正向迭代器（const_iterator）、const反向迭代器（const_reverse_iterator）。返回一个迭代器，该迭代器指向新插入元素。list底层是带头双向循环链表，所以其迭代器可以支持++、--等操作，但是不支持+、-等操作，例如其迭代器执行+n操作，无法得到下n个节点的迭代器，因为它们底层物理空间并不连续，固然可以用操作符重载+来实现，但是是不划算的。]]></description><category></category></item><item><title><![CDATA[【C++】vector模拟实现]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/144183138</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/144183138</guid><author>X__cheng</author><pubDate>Mon, 02 Dec 2024 21:15:41 +0800</pubDate><description><![CDATA[而匹配另一个构造函数的话，参数类型1个是size_type，1个是int，也可以匹配，但是相比于构造函数模板的实例化来说就没那么匹配了，当匹配了构造函数模板的实例化时，实例化而来的函数函数体内需要解引用操作，拿一个int类型的数据去解引用不报错才怪。由于vector是一个类模板，那么俺模拟实现也搞一个类模板。由于模拟实现的vector于命名空间std的vector类模板名相同，为了方便本博客的讲述，以下若是所述vector均默认指模拟实现的vector，若是指命名空间std的vector，则会标红，如。]]></description><category></category></item><item><title><![CDATA[【C++】vector]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/144076627</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/144076627</guid><author>X__cheng</author><pubDate>Thu, 28 Nov 2024 18:59:44 +0800</pubDate><description><![CDATA[6.读者老爷好，俺最近浅浅学了一些vector的知识，vector是STL容器的一种。有兴趣的话不妨垂阅！首先使用vector需要包含头文件好吧。中的其中一个类模板就是本博客要介绍的。进入可以看到：确实是一个类模板，第一个模板参数就是要存储的数据的类型，第二个模板参数是跟空间配置器和内存池相关的，不用理先。那我们就浅浅介绍一下。其实当这个类模板实例化成具体的类时，这些个具体的类底层就是顺序表。也就是可以认为vector是“一个可以存放任意类型数据的顺序表”。]]></description><category></category></item><item><title><![CDATA[【C++】string模拟实现]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/143534331</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/143534331</guid><author>X__cheng</author><pubDate>Tue, 12 Nov 2024 13:13:59 +0800</pubDate><description><![CDATA[思路：调用swap时要先传参，由于C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造，那么理论上，operator=的形参str拷贝构造一个临时对象，这个临时对象再拷贝构造swap的参数str，哪怕编译器优化掉了临时对象，swap的形参str也是通过ooperator=形参str拷贝构造的一个新对象，将这个新对象str与*this的内容交换一下不就搞定了。因为substr接口是传值返回，理论上是将substr的返回值S1拷贝到一个临时对象当中，局部对象S1便销毁了，再用临时对象拷贝构造S2的。]]></description><category></category></item><item><title><![CDATA[【C++】string]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/143261871</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/143261871</guid><author>X__cheng</author><pubDate>Thu, 31 Oct 2024 20:02:22 +0800</pubDate><description><![CDATA[1.成员函数接口浅浅介绍一下string，若读者老爷有兴趣不妨垂阅！俺上一篇博客最后浅浅介绍了一下STL，其中STL的六大组件之一就是容器。容器大致来说就是现成的数据结构，当俺们编程的时候想要使用栈、队列、二叉树……的模式来管理数据时，可以直接使用现成的STL里面的容器（栈、队列、二叉树……），就不用我们自己先手动实现栈、队列、二叉树……了。需要明确的是：string严格来说不属于STL的一部分，属于C++标准库，因为string的诞生时间要早于STL。]]></description><category></category></item><item><title><![CDATA[【C++】模板1.0和STL简介]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/140898235</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/140898235</guid><author>X__cheng</author><pubDate>Sun, 04 Aug 2024 20:46:34 +0800</pubDate><description><![CDATA[该语句不能通过编译，因为在编译期间，当编译器看到该实例化时，需要推演模板参数实际类型，通过实参a将T推演为int，通过实参b将T推演为double类型，但模板参数列表中只有 一个T，编译器无法确定此处到底该将T确定为int或者double类型而报错。有了STL之后，若是我们希望使用某个数据结构或者算法什么的，我们就不需要自己手撕一个出来了，直接使用STL里面的模板生成对应的东西就可以使用了，那不爽歪歪！用不同类型的参数使用函数模板时，也就是用函数模板生成对应模板参数（类型）的函数，称为函数模板的实例化。]]></description><category></category></item><item><title><![CDATA[【C++】内存管理]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/140750039</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/140750039</guid><author>X__cheng</author><pubDate>Tue, 30 Jul 2024 01:08:30 +0800</pubDate><description><![CDATA[使用new操作符进行动态内存管理也是有失败的风险的，当失败了就会抛异常，但是吧，俺们平时写的小程序申请那三瓜两枣的空间一般是不会失败的，一般不必担心，所以俺就不检查了。的意思是有一个存放在代码段的常量字符串"abcd\0"（其实代码段存放的是"abcd\0"的ASCII码），pChar是栈上的一个指针变量，这个指针变量指向常量字符串"abcd\0"的首元素。的意思是使用malloc函数在堆区申请了16个字节的空间，ptr1是栈上的一个指针变量，这个指针变量指向这块堆区开辟的空间的首元素。]]></description><category></category></item><item><title><![CDATA[【C++】日期类]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/139905784</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/139905784</guid><author>X__cheng</author><pubDate>Fri, 05 Jul 2024 22:25:06 +0800</pubDate><description><![CDATA[鼠鼠实现了一个日期类，用来练习印证前几篇博客介绍的内容！！本鼠创建一个工程，工程包含三个文件，分别是Date.h、Date.cpp和test.cpp。1.日期类的定义本鼠对日期本鼠对于成员函数大部分都采取声明和定义分离的方式。成员变量无非就是年、月、日呗。还运用了友元的知识。如上代码所示。2.得到某年某月的天数对于这个日期类所要实现的成员函数中有很多场景我们需要得到某年某月的天数，所以我们将这个功能实现成函数。又因为需要频繁调用这个函数，我们将他实现成内联函数。3.检查日期是否合法。]]></description><category></category></item><item><title><![CDATA[【C++】类和对象3.0]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/140104304</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/140104304</guid><author>X__cheng</author><pubDate>Fri, 05 Jul 2024 22:23:58 +0800</pubDate><description><![CDATA[但是如果自定义类型成员没有默认构造函数的情况下，如果我们不在初始化列表显式写该成员，编译器是不知道该如何调用俺们显式实现的构造函数的，所以编译器会认为没有合适的默认构造函数可用，就报错了，所以这种情况我们必须在初始化列表显式写，也就是显式调用其构造函数。难道是对象的具体成员变量定义的位置是在构造函数的函数体当中吗，当然不是，原因跟上面一样，函数体内关于某成员变量的语句可以多次出现，如果说关于某成员变量的语句第一次出现是其定义，那么当关于其成员变量的语句多次出现时，难道其成员变量可以多次定义吗？]]></description><category></category></item><item><title><![CDATA[【C++】类和对象2.0]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/139716401</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/139716401</guid><author>X__cheng</author><pubDate>Sun, 23 Jun 2024 02:01:05 +0800</pubDate><description><![CDATA[看主函数第一条语句创建Date类类型的对象d1，由于Date类中没有显式定义构造函数，就通过编译器生成的默认构造函数创建对象d1，由于内置类型成员变量在类的声明中给了缺省值，这个编译器生成的默认构造函数就将d1的内置类型成员变量初始化成了缺省值，对于d1的自定义类型成员变量_t，去调用它的默认构造函数Time()（本鼠显式定义了），所以d1的自定义类型成员变量_t的成员变量分别被初始化成了14、57、30。很简单，对象a是被const修饰的常对象 ，调用Print函数隐藏的this指针接收a的地址。]]></description><category></category></item><item><title><![CDATA[【C++】类和对象1.0]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/139419435</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/139419435</guid><author>X__cheng</author><pubDate>Tue, 04 Jun 2024 02:06:19 +0800</pubDate><description><![CDATA[我们看PrintA函数内部需要用到this指针解引用的哦，this指针接收到的值是空指针，而且成员变量_a是存储在this指向的空间里面的（成员变量存储在类实例化对象里面），当然会崩溃了。这两个对象个中成员变量是不同的（需要存储不同的属性，所以说是不同的），但是调用同一份函数（类方法是一样的）。this指针是隐藏起来的，拿上面代码来说：当d1调用Init函数时，传递的实参不仅仅有明面上的2024、6和4，还有该对象的地址，即d1的地址，而且第一个传递d1的地址。这些都是编译器完成的，我们不应该显示写出来。]]></description><category></category></item><item><title><![CDATA[【C++】C++入门2.0]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/139282912</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/139282912</guid><author>X__cheng</author><pubDate>Thu, 30 May 2024 21:05:36 +0800</pubDate><description><![CDATA[各位读者老爷好，本鼠最近浅学了一点C++的入门知识！利用本博客作为笔记的同时也希望得到各位大佬的垂阅！]]></description><category></category></item><item><title><![CDATA[【C++】C++入门1.0]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/139251128</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/139251128</guid><author>X__cheng</author><pubDate>Wed, 29 May 2024 00:19:08 +0800</pubDate><description><![CDATA[首先我们要知道C++中的域分为：1.全局域；2.局部域；3.命名空间域；4.类域。这个知识对于命名空间的介绍有帮助所以提前介绍。那么开始介绍命名空间如下：定义命名空间，需要使用到namespace关键字，后面跟命名空间的名字，然后接一对{}即可，{} 中即为命名空间的成员。注意：以下代码如果写在.c文件中会报错！1.正常的命名空间定义。// HD是命名空间的名字，一般开发中是用项目名字做命名空间名// 命名空间的成员可以定义变量/函数/类型struct LCDint age;]]></description><category></category></item><item><title><![CDATA[【数据结构1.0】计数排序]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/139034311</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/139034311</guid><author>X__cheng</author><pubDate>Mon, 20 May 2024 00:48:02 +0800</pubDate><description><![CDATA[读者老爷好，本鼠鼠最近学了计数排序，浅浅介绍一下！计数排序又称为鸽巢原理，是对哈希直接定址法的变形应用，是非比较排序的一种！这个排序算法不难理解，万物皆可举例，我们举例讲解啊！很久很久以前，有一只可爱的肥龙猫，叫做冬冬。有一天冬冬的男朋友给冬冬出了一个题目：有一组数组a如下，要冬冬用排序算法排成升序。]]></description><category></category></item><item><title><![CDATA[【数据结构1.0】归并排序]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/139030613</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/139030613</guid><author>X__cheng</author><pubDate>Sat, 18 May 2024 21:40:58 +0800</pubDate><description><![CDATA[本博客以排升序为例介绍归并排序！我们先看一个问题：有两组均为升序的数组要合并到一组数组当中，要求合并后的数组也是升序的，怎么办？办法：从头开始遍历两组数组，找“小”尾插到合并数组当中。举例如图：这其实是归并的思想！归并排序的基本思想：归并排序（MERGE-SORT）是建立在归并操作上的一种有效的排序算法,该算法是采用分治法（Divide and Conquer）的一个非常典型的应用。将已有序的子序列合并，得到完全有序的序列；即先使每个子序列有 序，再使子序列段间有序。]]></description><category></category></item><item><title><![CDATA[【数据结构1.0】快速排序]]></title><link>https://blog.youkuaiyun.com/X__cheng/article/details/138825336</link><guid>https://blog.youkuaiyun.com/X__cheng/article/details/138825336</guid><author>X__cheng</author><pubDate>Tue, 14 May 2024 21:42:32 +0800</pubDate><description><![CDATA[最近学习了快速排序，鼠鼠俺来做笔记了！本篇博客用排升序为例介绍快速排序！]]></description><category></category></item></channel></rss>