<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[szy0321的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/szy0321</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; szy0321]]></copyright><item><title><![CDATA[【Redis】数据类型——set]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/117067049</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/117067049</guid><author>szy0321</author><pubDate>Thu, 20 May 2021 11:22:39 +0800</pubDate><description><![CDATA[一、操作
1.sadd：给set中添加值
格式： sadd key value1 value2
sadd myset v1
sadd myset v2
sadd myset v3
sadd myset v1//设置重复值时失败！


2.smembers：获取set中的所有值
格式：smembers key
smembers myset


3.sismember：判断某个值是否在set中
格式： sismember key value
sismember myset v1


4.scard：获取set中]]></description><category></category></item><item><title><![CDATA[【Redis】数据类型——list]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/117061552</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/117061552</guid><author>szy0321</author><pubDate>Thu, 20 May 2021 09:34:58 +0800</pubDate><description><![CDATA[一、操作
1.启动redis服务器
 ./redis-server redis.conf

2.启动Redis的客户端
./redis-cli -p 6379

3.lpush rpush lrange操作：从左边，右边设置值和获取值
lpush k1 v1
lpush k1 v0
rpush k1 v2
lrange k1 0 -1

格式： lpush key value rpush key value
lrange key start stop

4.lpop rpop：从列表的左边或者右边移除值
格]]></description><category></category></item><item><title><![CDATA[页面置换算法——LRU的简易实现(C++)]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/116981906</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/116981906</guid><author>szy0321</author><pubDate>Tue, 18 May 2021 11:50:23 +0800</pubDate><description><![CDATA[LRU
最近最久未使⽤的置换算法（LRU）：最近最久未使用（LRU）的置换算法的基本思路是，发生缺页时，选择最长时间没有被访问的页面进行置换，也就是说，该算法假设已经很久没有使用的页面很有可能在未来较长的⼀段时间内仍然不会被使用。
图解：

最后一步因为1号页面是「过去时间段里最久没有被访问的」， 所以把1号页面换出到磁盘，然后把3号页面换入到内存。
代码简易实现
#include&lt;iostream&gt;
#include&lt;list&gt;
#include&lt;map&gt;
using ]]></description><category></category></item><item><title><![CDATA[【Redis】数据类型——字符串string]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/116978681</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/116978681</guid><author>szy0321</author><pubDate>Tue, 18 May 2021 11:19:38 +0800</pubDate><description><![CDATA[一、操作
1.启动redis服务器
 ./redis-server redis.conf

2.启动Redis的客户端
 ./redis-cli -p 6379


3.get、set操作：设置值和获取值
格式： set key value       get key
set key1 v1


get key1 


4.exists：判断key是否存在
格式： exists key
 EXISTS key1


5.append：追加字符串，如果key不存在，相当于set命令
格式： append ke]]></description><category></category></item><item><title><![CDATA[【Linux】查看网络性能的常用指令及其所显示的信息]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/116463884</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/116463884</guid><author>szy0321</author><pubDate>Thu, 06 May 2021 22:28:10 +0800</pubDate><description><![CDATA[网络性能指标有哪些？
通常是以 4 个指标来衡量网络的性能，分别是带宽、延时、吞吐率、PPS（Packet Per Second），它们表示的意义如下：
1.带宽：表示链路的最大传输速率，单位通常为 b/s （比特/秒）
2.时延：表示网络请求数据包发出后，收到对端响应，所需要的时间延迟。在不同场景中，这一指标可能会有不同含义。比如，它可以表示，建立连接需要的时间（比如 TCP 握手延时），或一个数据包往返所需的时间（比如 RTT）。
3.吞吐率：表示单位时间内成功传输的数据量，单位是 b/s（比特 / 秒]]></description><category></category></item><item><title><![CDATA[【C++设计模式】工厂模式及实现]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/116231399</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/116231399</guid><author>szy0321</author><pubDate>Wed, 28 Apr 2021 13:31:14 +0800</pubDate><description><![CDATA[一、简单工厂模式
1.概念：简单工厂模式是属于创建型模式，又叫做静态工厂方法(static Factory Method)模式，简单工厂模式是由一个工厂对象决定创建出来哪一种产品类的实例。实质是由一个工厂类根据传入的参数，动态决定应该创建哪一类产品类(这些产品类继承自一个父类或接口)的实例。
2.使用场景：
(1)在程序中，需要创建的对象很多，导致对象的new操作多且杂时，需要使用简单工厂模式；
(2)由于对象的创建过程是我们不需要去关心的，而我们注重的是对象的实际操作，
所以，我们需要分离对象的创建和操作]]></description><category></category></item><item><title><![CDATA[【C++设计模式】单例模式简单实现以及改进方法]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/116210140</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/116210140</guid><author>szy0321</author><pubDate>Tue, 27 Apr 2021 21:41:11 +0800</pubDate><description><![CDATA[什么是单例模式
许多时候整个系统只需要拥有一个的全局对象，这样有利于我们协调系统整体的行为。它的类图如下：

适用场景：
1.需要生成唯一序列的环境
2.需要频繁实例化然后销毁的对象。
3.创建对象时耗时过多或者耗资源过多，但又经常用到的对象。
4.方便资源相互通信的环境
饿汉式
单例类被加载时，就会实例化一个对象并交给自己的引用，供系统使用；而且，由于这个类在整个生命周期中只会被加载一次，因此只会创建一个实例，即能够充分保证单例。
#include&lt;iostream&gt;
using namesp]]></description><category></category></item><item><title><![CDATA[【排序算法】归并排序]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/115794670</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/115794670</guid><author>szy0321</author><pubDate>Sat, 17 Apr 2021 14:20:50 +0800</pubDate><description><![CDATA[归并排序
#include&lt;iostream&gt;
using namespace std;
void merge(int* a, int* temp, int begin, int middle, int end)
{
	int i = begin;
	int j = middle + 1;
	int k = 0;

	while (i &lt;= middle &amp;&amp; j &lt;= end)//比较两个指针所指向的元素，选择相对小的元素放入到合并空间，并移动指针到下一位置  
	]]></description><category></category></item><item><title><![CDATA[【排序算法】交换排序（冒泡排序，快速排序）]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/115794379</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/115794379</guid><author>szy0321</author><pubDate>Sat, 17 Apr 2021 14:08:05 +0800</pubDate><description><![CDATA[1.冒泡排序
#include&lt;iostream&gt;
using namespace std;
void bubbleSort(int arr[], int length)
{
	for (int i = 0; i &lt; length-1; i++)
	{
		for (int j = 0; j &lt; length-1-i; j++)
		{
			if (arr[j] &gt; arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr]]></description><category></category></item><item><title><![CDATA[【排序算法】选择排序（简单选择排序，堆排序）]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/115794292</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/115794292</guid><author>szy0321</author><pubDate>Sat, 17 Apr 2021 14:02:03 +0800</pubDate><description><![CDATA[1.简单选择排序
#include&lt;iostream&gt;
using namespace std;
void Swap(int arr[], int i, int j)
{
	int tmp = arr[i];
	arr[i] = arr[j];
	arr[j] = tmp;
}
void selectSort(int arr[], int length)
{
	if (arr==nullptr || length == 0)
		return;
	for (int i = 0; i &lt; l]]></description><category></category></item><item><title><![CDATA[【排序算法】插入排序（直接插入排序，希尔排序）]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/115794228</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/115794228</guid><author>szy0321</author><pubDate>Sat, 17 Apr 2021 13:56:10 +0800</pubDate><description><![CDATA[1.插入排序（Insertion Sort）
#include&lt;iostream&gt;
using namespace std;
void insertSort(int arr[], int length)
{
	for (int i = 1; i &lt; length; i++)
	{
		int end = i - 1;
		int tmp = arr[i];
		while (end &gt;= 0)
		{
			if (arr[end] &gt; tmp)
			{
				arr[en]]></description><category></category></item><item><title><![CDATA[【Linux】守护进程]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/115741842</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/115741842</guid><author>szy0321</author><pubDate>Thu, 15 Apr 2021 23:19:41 +0800</pubDate><description><![CDATA[守护进程
什么是守护进程
守护进程也称精灵进程（ Daemon），是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
在了解守护进程之前我们先需要知道一下几个概念
会话
操作系统调度的基本单位是进程，单个或多个进程组成进程组，单个或多个进程组则组成会话
getsid(0)//获得会话的ID，返回当前进程调用的会话ID

进程组
一个进程组中有一个组长进程和0个或多个组员进程，组长进程的进程ID等于其进程组ID。
getpgrp()//获得进程组的ID，就是进程组中]]></description><category></category></item><item><title><![CDATA[【C++11】浅谈右值引用]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/115302837</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/115302837</guid><author>szy0321</author><pubDate>Mon, 29 Mar 2021 22:01:56 +0800</pubDate><description><![CDATA[右值引用
什么是左值和右值：左值实指表达式结束后依然存在的持久对象，右值是指表达式结束后就不存在的临时对象。
区分左值和右值的便捷方法：看能不能对表达式取地址，如果能，为左值，如果不能，则为右值。所有的具名变量或对象都是左值，而右值不具名。
在C++11中右值由两个概念构成：
1.一个是纯右值，比如，非引用返回的临时变量，运算表达式产生的临时变量，原始字面量和la’mbda表达式等都是纯右值。
2.另一个则是将亡值，而将亡值是C++11新增的与右值引用相关的表达式，比如将要被移动的对象、T&amp;&amp]]></description><category></category></item><item><title><![CDATA[RAII]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/115301245</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/115301245</guid><author>szy0321</author><pubDate>Mon, 29 Mar 2021 15:13:05 +0800</pubDate><description><![CDATA[一、什么是RAII
RAII(Resource Acquisition Is Initialization)是由c++之父Bjarne Stroustrup提出的，中文翻译为 资源获取即初始化，使用局部对象来管理资源的技术称为资源获取即初始化。这里的资源主要是指操作系统中有限的东西，如内存，网络套接字，互斥量，文件句柄等，局部对象实指存储在栈的对象，它的生命周期是由操作系统来管理的，无需人工介入。
1、RAII的原理
资源的使用一般分为一下三个步骤：
1.获取资源（创建对象）
2.使用资源
3.销毁资源（析]]></description><category></category></item><item><title><![CDATA[【C++】C++中new/delete与malloc/free的区别]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/114398973</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/114398973</guid><author>szy0321</author><pubDate>Mon, 29 Mar 2021 13:59:10 +0800</pubDate><description><![CDATA[new/delete与malloc/free的区别
在C++中有malloc和free，为什么还需要new和delete呢？
malloc和free是C/C++语言的标准库函数，new和delete是C++的运算符。他们都用于申请动态内存和释放内存。
但是对于非内部数据类型的对象而言，只用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数，对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符，不在编译器控制权限之内，不能够把执行构造函数和析构函数的任务]]></description><category></category></item><item><title><![CDATA[三种I/O复用方式——select、poll和epoll]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/114378522</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/114378522</guid><author>szy0321</author><pubDate>Fri, 05 Mar 2021 14:58:45 +0800</pubDate><description><![CDATA[为什么要引入I/O复用：
TCP服务器在与客户端完成建立连接，并在完成整个交互过程之后再断开连接。在服务端的代码中，在收发数据时加上一个while循环,用于解决同一个客户端的多次收发数据请求。但当多个客户端同时向服务器发出请求时，当前的服务器无法满足要求，所以引入了I/O复用，可以使程序同时监听多个文件描述符，这样能使程序的性能提高。
I/O复用的场景：
1.TCP服务器需要同时处理监听socket、连接socket
2.服务器要同时接听多个端口
3.客户端程序要同时处理用户输入和网络连接
4.程序要同时处]]></description><category></category></item><item><title><![CDATA[C语言中sizeof和strlen的区别]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/114377906</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/114377906</guid><author>szy0321</author><pubDate>Thu, 04 Mar 2021 21:26:44 +0800</pubDate><description><![CDATA[sizeof和strlen的区别
最近复习了c语言，在字符串，数组中经常用到的sizeof和strlen有什么区别呢？可能在实际运用中会混在一起，所以这篇文章把它们的用法总结的清清楚楚。
举下面几个例子
第一个例子：
char *s="0123456789";

sizeof(s)的结果位4，s是指向字符串常量的字符指针
sizeof(*s)的结果位1，*s是第一个字符
第二个例子：
int s[100]="0123456789";

sizeof(s)的结果为400，s表示在内存中的大小，100*4=40]]></description><category></category></item><item><title><![CDATA[【Linux】gcc编译过程——预编译，编译，汇编，链接]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/110437665</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/110437665</guid><author>szy0321</author><pubDate>Tue, 01 Dec 2020 16:42:28 +0800</pubDate><description><![CDATA[【Linux】gcc编译过程——预编译，编译，汇编，链接
前言
平时我们在windows系统下的例如VS这样的集成开发环境中编写代码，我们只需要点击编译器的编译便可以生成一个可执行文件（在windows系统下是PE格式，在Linux系统下是ELF格式），而这个编译器又是如何将代码编译成这个文件的呢？因此我们在Linux系统下gcc编译器中展示这个过程。
1.预编译
预编译的命令为
gcc -E hello.c -o hello.i

预编译过程主要处理了 “#”那些源代码中的以"#“开始的预编译指令。比如”]]></description><category></category></item><item><title><![CDATA[判断一棵二叉树是否为满二叉树(两个队列)]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/110088626</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/110088626</guid><author>szy0321</author><pubDate>Tue, 24 Nov 2020 22:13:18 +0800</pubDate><description><![CDATA[判断一棵二叉树是否为满二叉树
1。递归
bool Is_Full(BtNode *ptr)
{
	return ((ptr==NULL) &amp;&amp; Is_Full(ptr-&gt;leftchild) &amp;&amp; Is_Full(ptr-&gt;rightchild) &amp;&amp; (Get_Depth(ptr-&gt;leftchild) == Get_Depth(ptr-&gt;rightchild)))
}

使用递归的方法特别地麻烦，递归的量特别的大，所以我们换一种思路]]></description><category></category></item><item><title><![CDATA[递归与非递归方式寻找二叉树中某个节点的值]]></title><link>https://blog.youkuaiyun.com/szy0321/article/details/110069408</link><guid>https://blog.youkuaiyun.com/szy0321/article/details/110069408</guid><author>szy0321</author><pubDate>Tue, 24 Nov 2020 17:25:48 +0800</pubDate><description><![CDATA[递归与非递归方式寻找二叉树中某个节点的值

]]></description><category></category></item></channel></rss>