<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[dream8834的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/dream8834</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; dream8834]]></copyright><item><title><![CDATA[C++多态解析]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103628900</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103628900</guid><author>dream8834</author><pubDate>Fri, 20 Dec 2019 12:05:45 +0800</pubDate><description><![CDATA[什么是多态？
多态（Polymorphism）按字面的意思就是“多种状态”。在面向对象语言中，接口的多种不同的实现方式即为多态。
构成多态的条件
1.有继承关系
2.虚函数的重写
2.通过基类对象的指针或者引用调用虚函数
什么是虚函数
类的成员函数前加上virtual关键字，就构成了虚函数。
虚函数的重写
当在子类定义一个与父类完全相同的虚函数时，我们就称，子类的虚函数重写（覆盖）了父类的虚函数。...]]></description><category></category></item><item><title><![CDATA[C++智能指针]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103625546</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103625546</guid><author>dream8834</author><pubDate>Fri, 20 Dec 2019 01:17:55 +0800</pubDate><description><![CDATA[什么是智能指针？为什么要有只能指针？
在C++程序里，使用new关键字开辟的内存必须被手动delete掉，不然就会导致内存的泄漏，但是，当程序非常冗长，你能保证自己每一个手动开辟的内存块都释放了吗？在delete之前，倘若程序因为异常跳转后，你还能保证内存被释放吗？为了解决这种因为遗忘或者异常处理而导致内存泄漏的问题，我们就要用智能指针。
智能指针运用了一种叫做RAII的技术，即利用对象生命周期来...]]></description><category></category></item><item><title><![CDATA[C++之多继承]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103624569</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103624569</guid><author>dream8834</author><pubDate>Fri, 20 Dec 2019 00:10:44 +0800</pubDate><description><![CDATA[什么叫多继承
多继承就是一个子类有两个及以上的父类。
多继承的方式
一般形式：

菱形继承：

第一种继承方式：派生类会同时拥有两个基类的特性（属性和方法，也就是两个类的所有成员）。
第二种继承方式：这个结构中类C同时拥有类B1和类B2的特性，但是这就会产生一个问题，上述两个类都继承自类A，那么类C的对象会同时包含两个A的对象。这样就会带来数据冗余和二义性问题。
菱形继承：
class Perso...]]></description><category></category></item><item><title><![CDATA[C++继承解析]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103615830</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103615830</guid><author>dream8834</author><pubDate>Thu, 19 Dec 2019 17:30:43 +0800</pubDate><description><![CDATA[继承的概念及定义
继承的概念
继承是面向对象程序设计使代码可以重复使用的重要手段，它可以在原有类的基础上进行扩展，增加功能，产生新的类，称为派生类，派生类拥有原有类的所有成员，是一种类的复用的重要思想。
继承的定义
继承定义的格式：

派生类的继承方式和对基类成员访问权限：

总结：
1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派...]]></description><category></category></item><item><title><![CDATA[哈希表的实现（哈希桶 开链法）]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103505455</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103505455</guid><author>dream8834</author><pubDate>Thu, 12 Dec 2019 11:05:18 +0800</pubDate><description><![CDATA[哈希桶不是使用更改状态来表示删除，而是采用了链表的删除和插入操作。因为采取了链表和vector结合的做法，所以在结点设计上删去了_status（状态），增加了一个指向下一个结点的指针_next。
template&lt;class K, class V&gt;
struct HashTableBucketNode
{
	K _key;
	V _value;

	HashTableBucketNod...]]></description><category></category></item><item><title><![CDATA[哈希表的实现（开放定址法）]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103503987</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103503987</guid><author>dream8834</author><pubDate>Thu, 12 Dec 2019 10:10:25 +0800</pubDate><description><![CDATA[enum Status
{
	EMPTY,
	EXIST,
	DELETE,
};

template&lt;class K, class V&gt;
struct HashTableNode
{
	K _key;
	V _value;
	Status _status;

	HashTableNode(const K&amp; key = K(), const V&amp; value = V()...]]></description><category></category></item><item><title><![CDATA[哈希表介绍]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103501513</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103501513</guid><author>dream8834</author><pubDate>Thu, 12 Dec 2019 01:12:20 +0800</pubDate><description><![CDATA[Hash表概念
在顺序结构及树中，元素关键码与其存储位置之间没有对应关系，所以查找的时候要进行多次的比较，有没有一种搜索方法，可以不经过任何比较，一次直接获得想要搜索的元素。构造一种存储结构，通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系，根据这种想法构造了Hash表。
当向该结构中：
插入元素
根据待插入元素的关键码，以此函数计算出该元素的存储位置并按此位...]]></description><category></category></item><item><title><![CDATA[unordered_map的介绍与使用]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103500613</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103500613</guid><author>dream8834</author><pubDate>Wed, 11 Dec 2019 23:14:21 +0800</pubDate><description><![CDATA[unordered_map介绍
1.unordered_map是存储&lt;key, value&gt;键值对的关联式容器，其允许通过key快速的索引到与其对应的 value。
2.在unordered_map中，键值通常用于惟一地标识元素，而映射值是一个对象，其内容与此键关联。键 和映射值的类型可能不同。
3.在内部,unordered_map没有对&lt;kye, value&gt;按照任何特...]]></description><category></category></item><item><title><![CDATA[红黑树]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103492765</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103492765</guid><author>dream8834</author><pubDate>Wed, 11 Dec 2019 17:09:16 +0800</pubDate><description><![CDATA[红黑树的概念
红黑树，是一种二叉搜索树，但在每个结点上增加一个存储为表示结点的颜色，可以使Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制，红黑树确保没有一条路径会比其他路径长出两倍，因而是接近平衡的。
红黑树的性质
1.每个结点不是红色就是黑色
2.根节点是黑色的
3.如果一个节点是红色的，则它的两个孩子结点是黑色的
4.对于每个结点，从该结点到其所有后代叶结点的简单路...]]></description><category></category></item><item><title><![CDATA[AVL树]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103417896</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103417896</guid><author>dream8834</author><pubDate>Fri, 06 Dec 2019 11:10:00 +0800</pubDate><description><![CDATA[1.什么是AVL树
AVL树是二叉搜索树的优化版，又称平衡二叉搜索树，高度平衡树。
我们都知道当一棵二叉搜索树的结点一直单边插入时，这时候它的查找效率趋近O（n），非常慢。而AVL树的特是：“AVL树中任何结点的两个子树的高度最大差别为1” ，这样就克服了结点单边存储而导致查找效率低下的问题。

如上图，左边是AVL树，右侧为非AVL树，右子树高度减去左子树的高度(简称平衡因子)的绝对值不超过1(...]]></description><category></category></item><item><title><![CDATA[map与set]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103416093</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103416093</guid><author>dream8834</author><pubDate>Fri, 06 Dec 2019 10:13:51 +0800</pubDate><description><![CDATA[Map介绍
Map是一组成对的键值对对象，允许使用键（key）来查找（value）。它提供了一个映射表，可以通过某个对象来查找另一个对象。它也被称作关联数组，因为它将某些对象与另外一些对象关联在一起；或者称作字典，通过键对象来查找值对象，就像在字典中使用单词来定义一样。
Map特点

map是关联容器，它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。
在map中，...]]></description><category></category></item><item><title><![CDATA[C++中vector与list的区别]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103378786</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103378786</guid><author>dream8834</author><pubDate>Tue, 03 Dec 2019 23:55:27 +0800</pubDate><description><![CDATA[底层结构
vector：底层为动态顺序表，在内存中是一段连续的空间。
list：底层结构是带头结点的双向循环链表，在内存中不是一段连续的空间。
随机访问
vector：支持随机访问，可以通过下标直接访问某个元素，访问某个元素的时间复杂度为O(1)。
list：不支持随机访问，只能通过从前向后或从后向前依次遍历来访问某个元素，时间复杂度是O(N)。
插入和删除
vector：任意位置插入和删除效率低...]]></description><category></category></item><item><title><![CDATA[vector中迭代器失效问题]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103359054</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103359054</guid><author>dream8834</author><pubDate>Tue, 03 Dec 2019 00:05:20 +0800</pubDate><description><![CDATA[当使用vector容器时，如果进行以下2中操作中的一种：
1.vector已满情况下再进行插入操作。
2.使用erase()删除数据。
就会导致迭代器失效。
插入操作举例：
#include&lt;iostream&gt;
#include&lt;vector&gt;
using namespace std;

int main()
{	
	vector&lt;int&gt; v;
	v.push...]]></description><category></category></item><item><title><![CDATA[深浅拷贝及写实拷贝]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103219538</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103219538</guid><author>dream8834</author><pubDate>Sun, 24 Nov 2019 00:19:07 +0800</pubDate><description><![CDATA[浅拷贝
对于String类的拷贝构造早函数及operator=函数来说，当用一个string对象拷贝构造或复制给另一个String对象时，就是讲这个对象里的指针的值赋值给另一个对象里的指针。讲一个帧赋值给另一个指针，就会使得两个指针指向同一块空间，就产生了浅拷贝。
class String
{
public:
	String(const char* str)
		:_str(new char[st...]]></description><category></category></item><item><title><![CDATA[单例模式]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103208781</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103208781</guid><author>dream8834</author><pubDate>Sat, 23 Nov 2019 00:47:10 +0800</pubDate><description><![CDATA[什么是单例模式
单例模式是一种常用的设计模式。它能够保证系统中应用该模式的类只有一个实例，并提供一个访问它的全局访问点，该实例被所有程序模块共享。
单例模式实现方式
单例模式的实现有两种方式：饿汉模式和懒汉模式。
饿汉模式
该种模式是不管你将来用不用，在程序运行之初就将对象创建好，程序启动时就创建唯一的实例对象。在访问量比较大，或者可能访问的线程比较多时，采用饿汉模式实现，可以实现更好的性能。以空...]]></description><category></category></item><item><title><![CDATA[设计一个类只能在堆（或栈）上创建对象]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/103207436</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/103207436</guid><author>dream8834</author><pubDate>Fri, 22 Nov 2019 22:02:26 +0800</pubDate><description><![CDATA[设计一个类，只能在堆上创建对象。
思考：
1.因为无论是在堆上还是在栈上创建对象，都要调用构造函数。所以要防止在栈上创建对象，构造函数要私有化。
2.因为构造函数的私有化，所以不能在类外调用构造函数，那么类中就要有一个共有的成员函数，在其中new一个对象出来。但是在调用该成员函数的时候又必须先创建一个对象才能调用，所以这个时候将该成员函数设置成静态函数，这样就能够只通过类名来访问这个静态成员函数了...]]></description><category></category></item><item><title><![CDATA[C++类和对象——6个默认成员函数]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/99610415</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/99610415</guid><author>dream8834</author><pubDate>Wed, 14 Aug 2019 21:35:57 +0800</pubDate><description><![CDATA[在C++中有了个默认成员函数：
1.构造函数
2.析构函数
3.拷贝构造函数
4.赋值运算符重载
5.取地址符重载
6.const修饰的取地址符重载
介绍上述的成员函数之前先介绍在这写成员函数中会用到的两个概念：
1.函数重载
（1）相同的范围（在同一个类中）；
（2）函数名字相同；
（3）参数个数或数目不同。
2.缺省函数
缺省函数就是在声明函数的某个参数的时候指定一个默认值，在调用这个函数的时...]]></description><category></category></item><item><title><![CDATA[迷宫问题（C语言）]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/99593661</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/99593661</guid><author>dream8834</author><pubDate>Wed, 14 Aug 2019 20:56:06 +0800</pubDate><description><![CDATA[第一类 简单迷宫（不含多条出路，不带环）（0代表墙，1代表通路）
示意图：

思路分析：
1.以入口为起点，寻找出口（除了起点以外的边缘上的点）
2.判定当前点坐标是否可以走。（坐标合法且不为0）
3.如果合法则将当前点标记成走过的并入栈（维护一个栈可以记录走过的路径，栈的长度就是路径的长度）
4.判断当前点是否是出口，是出口就return（该迷宫不存在别的出口），如果不是出口，以顺时针的方向（上...]]></description><category></category></item><item><title><![CDATA[“随心所语”]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/88915955</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/88915955</guid><author>dream8834</author><pubDate>Sat, 30 Mar 2019 17:38:12 +0800</pubDate><description><![CDATA[该项目使用的技术：
1.C++STL
2.生产者消费者模型
3.多线程技术，线程的同步与互斥
4.网络编程
5.开源jsoncpp库
6.ncurses库
7.自定义协议，登录注册认证
实现的基本想法：项目分可分为3个模块：
1.登录、注册和退出    2.用户发送消息，服务器接收    3.服务端的数据转发
1.登录和注册（TCP）
注册：将自己的注册信息通过TCP发给服务器，服务器接收下来并保...]]></description><category></category></item><item><title><![CDATA[七大经典排序算法]]></title><link>https://blog.youkuaiyun.com/dream8834/article/details/87905013</link><guid>https://blog.youkuaiyun.com/dream8834/article/details/87905013</guid><author>dream8834</author><pubDate>Wed, 13 Mar 2019 12:23:45 +0800</pubDate><description><![CDATA[1.冒泡排序
基本思想：比较相邻两个数，如果前者比后者大，则进行交换。每一轮交换结束，会有一个最大的数放在数组的最后面，经过N-1轮，排序完成。oid Bubble_Sort(int* a, int size)
{
int temp = 0;
for (int i = 0; i &amp;amp;lt; size - 1; i++)
{
for (int j = 0; j &amp;amp;lt; size - 1 - i; j...]]></description><category></category></item></channel></rss>