自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhc的博客

快乐踏实的学习

  • 博客(258)
  • 资源 (3)
  • 问答 (1)
  • 收藏
  • 关注

原创 Python3基本数据类型以及对其增删改查

Python3 中有六个标准的数据类型:Python3 的六个标准数据类型中:

2023-02-26 20:41:52 243 1

原创 Lambda表达式的本质

lambda表达式又叫做匿名函数,lambda表达式本质是一个匿名类,下面咱们开始介绍下lambda表达式。

2023-02-26 11:07:38 5134 1

原创 C++ pure virtual method called报错,与原因分析

C++ pure virtual method called

2023-02-12 23:16:20 2353

原创 C++中的多态

虚函数表

2023-02-12 17:19:39 220

原创 对RPC的简单理解

RPC全称为RemoteProcedureCall,即远过程调用。如果没有RPC,那么跨机器间的进程通讯通常得采用消息(网络通信tcp或者udp),这会降低开发效率,也会增加网络层和上层的耦合度,RPC可以帮助我们解决这些问题。其实就是他封装了这个网络通信的实现细节,与具体的通信不耦合,不用写网络通信的代码,自然就会提高开发效率。我在工作中用到的主要两种rpc就是Zeroc的ice,以及google的grpc....

2022-07-17 12:46:35 765

原创 Linux如何返回线程退出时的数据(以整数为例)

最近想写一篇std::future的文章,先来总结下,线程的退出值,以及如何回收这个退出值。这里主要参看了网上的文章,具体链接见文尾。在Linux中,线程的应用还是比较广泛的,同时,线程退出的返回值对线程来说,也是一种比较客观的数据传输。本文主要是在Linux中进行测试,不涉及windows等其他OS。1. 线程的创建 pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start_routine)(..

2022-05-14 16:40:45 703 1

原创 C++线程池的实现

池式结构 在计算机体系结构中有许多池式结构:内存池、数据库连接池、请求池、消息队列、对象池等等。 池式结构解决的主要问题为缓冲问题,起到的是缓冲区的作⽤。 线程池通过使⽤线程池,我们可以有效降低多线程操作中任务申请和释放产⽣的性能消耗。特别是当我们每个线程的任务处理⽐较快时,系统 ⼤部分性能消耗都花在了pthread_create以及释放线程的过程中。那既然是这样的话,何不在程序开始运⾏阶段提前创建好⼀堆线程,等 我们需要⽤的时候只要去这⼀堆线程中领⼀个线程,⽤完了再放回去,等程.

2022-05-07 23:08:45 2120

原创 深入理解递归函数

1.递归函数概念介绍以及个人对递归的理解先给出一个概念:递归函数:我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。一直都对递归有种敬畏之情,因为之前在一家公司里是不让写递归的,我记得当时的理由是递归代码比较晦涩,所以自己也就一直没有对递归深入的了解,但是随着时间的推移,我感觉有的时候,用递归写的代码是优雅的,递归应该算作是一种算法,或者编程技巧。当然递归也有自己的缺点,它会有函数间的不断调用,函数调用栈是比较消耗时间和内存的,同时如果递归结束条件写的不对,也会造成

2022-05-04 18:00:35 5043

原创 仿函数和重载<在sort和set中的应用

这里记录下仿函数和重载<在 sort和set 中的应用#include<iostream>#include<vector>#include<set>using namespace std;class Data{public: Data(int aa){ a_=aa; } /*bool operator < (const Data&d2) const{ return this-&.

2022-05-03 08:06:36 174

原创 Linux下静态库与动态库的引用关系深入分析

很久就想写一篇关于动态库和静态库互相引用的一篇文章,但是总感觉准备不充分,而一直没有勇气下笔,最近在和同事的讨论中,似乎有了一些新的认识,想把这些记录下来,和大家进行一次分享,同时也是做一次记录。这篇文章将从以下几个方面进行分析讲解1.程序的编译过程2.什么是静态编译,动态编译3.如何生成静态库,如何生成动态库4.动态库和静态库相互引用后,应用程序是否可以只使用一个库(例如:应用用到了静态库a,而静态库a里使用了库b,那么应用程序是不是只要链接a就可以了呢)5.动态库的两种加载方

2022-04-24 16:20:09 4715

原创 带继承和组合关系的类中构造函数和析构函数的调用顺序

1.构造函数构造函数的调用顺序如下:基类构造函数,C++提出的成员初始化列表,对象成员构造函数(非指针类型),派生类本身的构造函数。2.析构函数调用顺序,析构函数的调用顺序如下:(析构函数的调用顺序正好和构造函数的调用顺序相反)派生类本身的析构函数,对象成员的析构函数,基类的析构函数。这里没有写这个C++提出的成员初始化列表的原因是,他只是负责构造了,构造之后,析构就都是调用对象成员的析构函数了。这里给出具体的例子看下:首先这个例子先不给出 C++提出的成员初始化列表,让我们

2022-04-22 09:54:48 1015 2

原创 二叉树的深度优先遍历非递归深度解析

如上图二叉树的遍历主要思想就是通过递归方式进行遍历,同时如果要非递归遍历的话,一般情况下,深度优先遍历需要借助stack保存中间变量的方式进行遍历,广度优先遍历的话需要借助queue来保存每一层变量的方式进行遍历。对于深度优先遍历的递归的三种形式,不进行介绍,广度优先遍历,递归和非递归这篇文章也不进行介绍,这里就是想深刻的说下,深度优先遍历的三种非递归实现的原理。先说下三种遍历的实现顺序吧前序遍历:根,左,右中序遍历:左,根,右后续遍历:左,右,根因为二叉树给到我们的是根结点:...

2022-04-18 14:44:55 2162

原创 红黑树的性质以及时间复杂度证明

很久就想写一篇红黑树的博客,一直没有倒出时间,今天想稍微的总结下红黑树,但是并不想介绍如何的进行插入删除,以及怎么进行旋转,变色,本编文章主要讲解红黑树的时间复杂度的证明,要想证明红黑树的时间复杂度,我们先得说说两件事,红黑树的性质和数学归纳法:1.红黑树的性质有哪些,有了这些性质,我们才能后面进行证明先来一张红黑树的图片,便于后期进行对红黑树进行分析:先说下红黑树的性质:Every node is either red or black. The root is black..

2022-03-28 18:27:11 2150 1

原创 标准输入、标准输出、标准错误(以及前后台启动程序)

之前一直想写一篇文章总结下,标准输入、标准输出、标准错误,首先这三个对应的是三个文件描述符,这三个对应的文件描述符数值是 0,1,2,而这三个文件描述符是共享的,也就是每一个打开的终端都共享这三个文件描述符,看下下面的表格:当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:类型 文件描述符 默认情况 对应文件句柄位置 标准输入(standard input) 0 从键盘获得输入 /proc/self/fd/0 标准输出(

2022-02-17 15:05:30 2917

原创 tcp 端口复用与惊群效应(REUSEADDR、REUSEPORT)

我在之前的一篇文章中,介绍了我在之前的项目中遇到的端口复用,windows 的udp里端口复用导致了一个bug,具体的链接参考如下:关于Socket中端口复用_zhc的博客-CSDN博客_socket端口复用而我现在是想总结一下,linux下的情况,想从头再梳理下,REUSEADDR 和 REUSEPORT的作用。1.SO_REUSEADDR 是为了解决time_wait问题而产生的SO_REUSEADDR 它的作用是当服务器端主动断开链接的时候,处在timewait阶段大约60秒钟,服

2022-02-16 16:06:18 4144

原创 Typedef的作用

1.定义一种类型的别名,而不只是简单的宏替换。例子:typedef unsigned char uint_8;typedef char int_8;typedef std::shared_ptr<Table> TablePtrType;2.用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如:  struct tagPOINT1  {  int x;  in

2022-01-10 11:32:26 747

原创 简单工厂改进抽象工厂(大话设计模式C++实现)

类图如下:代码如下:#include<iostream>#include<string>using namespace std;//数据库 有Sqlserver Access 两个//表 两个 有User表,Department表,//假设只有两个字段,name和id//两个数据单独定义两个类 User Department//对数据不进行具体处理,只是进行打印class User{public: void SetID(int.

2021-09-12 21:58:44 204

原创 抽象工厂模式(大话设计模式C++实现)

抽象工厂模式类图代码如下:#include<iostream>#include<string>using namespace std;//数据库 有Sqlserver Access 两个//表 两个 有User表,Department表,//假设只有两个字段,name和id//两个数据单独定义两个类 User Department//对数据不进行具体处理,只是进行打印class User{public: void SetID(i

2021-09-12 21:27:40 187

原创 简单工厂模式(大话设计模式C++实现)

简单工厂模式(大话设计模式C++实现)类图代码如下#include#includeusing namespace std;class Operation{public:virtual double getResult()=0;void SetNumberA(double value){NumberA = value;}double GetNumberA(){return NumberA;}void SetNumberB(double value){NumberB

2021-09-08 10:37:38 181

原创 设计模式之工厂模式(大话设计模式C++实现)

类图如下:代码实现如下:最近时间比较忙,后期考虑上传到github上。#include<iostream>#include<string>using namespace std;class Operation{public: virtual double getResult()=0; void SetNumberA(double value){ NumberA = value; } void SetNumb

2021-09-07 20:57:36 113

原创 std::function与std::bind的使用总结

文章转载自:C++中函数指针的用途非常广泛,例如回调函数,接口类的设计等,但函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器。std::function vs 函数指针C++函数指针相信大家用的很多了,用法最广泛的应该就是先定义函数指针的类型,然后在声明一个函数指针的变量作为另一个函数的入参,以此作为回调函数,如下列代码所示:typedef voi

2021-04-12 19:54:56 2981 1

原创 关于C/C++编译器

我们在开始学习C/C++语言之前肯定得会学习程序运行的过程,主要是编译器在起到很大的作用,包括预处理:把头文件替换,宏替换,编译优化:转化为汇编语言汇编阶段:把汇编语言翻译成机器指令链接阶段:将目标文件链接起来生成可以执行的文件。那么常见的编译器有哪些呢?1.GNU Compiler Collection (GCC)GCC 原来作为GNU 操作系统的官方编译器,但是后来已经作为类unix操作系统:比如 linux,Mac OS x等,采纳为标准的编译器,GCC也同样支持Win

2021-04-09 14:27:13 1193

原创 git pull与 git fetch

1.git pullgit pull是拉取远程分支更新到本地仓库的操作。比如远程仓库里的学习资料有了新内容,需要把新内容下载下来的时候,就可以使用git pull命令。事实上,git pull是相当于从远程仓库获取最新版本,然后再与本地分支merge(合并)。也就是说git pull = git fetch + git mergegit pull的常见格式如下:git pull <远程主机名> <远程分支名>:<本地分支名>一般远程主机名字我

2021-02-09 16:24:09 1222

原创 git checkout

在实际应用中,git checkout是最为常见命令之一。此命令参数众多,功能多样,但有些功能可能整个职业生涯都不会用到,所以本文只介绍最为实用的部分。一.命令概述:众多教程将此命令翻译成"检出",比如检出某分支。由于本人英文水平有限(良心话)不能理解它的含义,当然这也不是我们所深究的重点。作用综述如下:(1)切换或者新建分支。(2)将暂存区或者指定commit内容覆盖到工作区。二.切换或者新建分支:首先查看一下当前项目的分支:git branchgit chec

2021-02-09 14:49:28 234

原创 git commit--amend

最近在使用git,感觉git和svn有很大的不同,一直想写一篇文章来总结下git和svn最大的区别就是git是一个非全量的分之形式,而svn是一个全量的形式,svn想要拉分之非常的费力。使用git的常用步骤:1.从代码库clone下代码2.本地进行修改文件,代码git add ***git commitgit push一般我们在push之前都会将我们修改的代码进行review下,我们要知道我们推动给gerrit的是哪些文件,用git status 指令就能够清楚我们.

2021-02-07 21:10:09 1268

原创 将二叉搜索树转为一个排好序的双向链表

这道题在面试中比较常见,原因有几个1.要涉及到二叉树的中序遍历。2.考察了二叉排序树的特点。3.考察了双向链表。4.大量考察了指针的使用,以及递归思想。大致的解题思想如下:1.进行中序遍历2.完成上一个节点和当前节点的 二叉树和链表的左右指针关系的转化。2.1 原先指向左子节点的指针 调整为链表中指向前一个节点的指针2.2 原先指向右子节点的指针 调整为链表中指向后一个节点的指针我们的调整策略是两个点两个点之间进行调整 一次只会调整两个节点 不...

2020-12-06 17:55:18 208

原创 二叉树的前序遍历的非递归实现

我们知道二叉树的遍历主要有,前序,中序,后续,我们常用递归的方式进行实现,而我们都知道能用递归函数实现,都可以用数据结构栈进行实现。下面我们就用栈的数据结构来处理二叉树的前序遍历:BinaryTree.h#pragma oncestruct BinaryTreeNode{ int m_value; struct BinaryTreeNode* m_left; struct BinaryTreeNode* m_right;};//二叉树结点的创建struct BinaryTree

2020-12-06 17:23:27 1650

原创 二叉树的四种遍历方式

最近在复习树,学习了下树的遍历,以及静态的生成树,动态的生成树,我们一般用到的是#号法创建,这个请参考我的另外一篇博客这个不多说,直接上代码BinaryTree.h如下代码:#pragma oncestruct BinaryTreeNode{ int m_value; struct BinaryTreeNode* m_left; struct BinaryTreeNode* m_right;};//二叉树结点的创建struct BinaryTreeNode* CreateBin

2020-12-05 12:05:48 210

转载 c11中新增加容器

转载自https://zhuanlan.zhihu.com/p/137428884本文主要对C++11/14中标准库新增容器的特性进行详细说明,方便大家学习参考。1.std::array为什么要引入这个容器呢?主要有两点原因:A.std::vector太强大了,存储在堆内存中,而std::array存储在栈内存中,访问更加灵活,可以获得更高的性能;B. 使用std::array能够让代码变得更加现代,且封装了一些函数和算法,使用起来比传统数组更方便;std::array会在编译时...

2020-12-02 03:24:10 593

转载 单链表是否有环问题常见面试题

转载https://www.cnblogs.com/yorkyang/p/10876604.html

2020-11-29 20:45:54 123

原创 线性表的反转

线性表的反转,是指将头结点变成尾结点,尾结点变成头结点这个主要注意两点:防止断链,所以要提前保留当前指针的后一个指针,当前指针的next域要,指向前一个结点,所以要有前一个结点的指针,再加上当前结点,就是共有三个辅助指针变量。不多说,直接上代码,这里的代码用到了之前的我的一篇文章里的代码线性表的链式存储(传统模式)话不多说,直接上代码:#include<iostream>#include<vector>using namespace std;struc.

2020-11-28 21:28:51 1261 1

原创 数据库的优化方式有哪些

作者:谭庆波链接:https://www.zhihu.com/question/36431635/answer/381557352来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。对于后端开发人员来说,经常会和数据打交道,所以数据库的优化很重要,今天总结下部分数据库的优化知识。主要可以通过以下几种方式对数据库进行优化:性能优化表的设计合理化,符合三大范式(3NF) 1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满.

2020-11-27 22:04:14 945

原创 redis的五种数据类型

redis开创bai了一种新的数据存储思路,使用redis,我们不du用在面对功能单调的数据库时,把zhi精力放在如何把dao大象放进冰箱这样的问题上,而是利用redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。redis常用数据类型redis最为常用的数据类型主要有以下五种:stringhashlistsetsorted set在具体描述这几种数据类型之前,我们先通过一张图了解下redis内部内存管理中是如何描述这些不同数据类型的:首先redis内部使用一个redisob

2020-11-27 21:59:11 887

原创 排序算法之直接插入法

插入算法主要记住三点:就是算法的核心了1.要比较的元素拿出来2.符合条件的元素后移3.把拿出来的元素放到正确的位置直接上代码:#include<iostream>using namespace std;//直接插入元素的本质/*1.要比较的元素拿出来2.符合条件的元素后移3.把拿出来的元素放到正确的位置49 38 65 97 76 13 27*/void StraitInsertSort(int array[],int length){ int tmp =

2020-11-19 21:42:31 3029

原创 结构体内存对齐的原因以及如何进行内存对齐

1.结构体内存对齐的原因?什么是对齐,以及为什么要对齐: 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,

2020-11-16 19:47:17 1165

原创 扩展二叉树(#号法)先序和后续可确定二叉树,中序不可

在我们动态的创建二叉树的时候,一般会选择#号法,本文主要是讲解为什么扩展二叉树的先序和后续都可以唯一确定一颗二叉树,而中序不可以。我们在讲解扩展二叉树之前,先来回顾下,非扩展的二叉树,非扩展的二叉树,我们在已知前序,中序,后续任意一个遍历序列的时候,都是不能唯一确定一个二叉树的,因为如果知道前序和后续,只是知道哪个是跟结点,但是无法区分左右孩子,而知道了中序遍历,不知道头结点,区分左右子树也没有意义,所以一定是前序+中序 或者后续+中序的组合才可以。而扩展二叉树的意思是把一棵树的左右孩子都..

2020-11-01 17:35:56 5067 2

原创 Notepad++的tab设置为四个空格或者默认使用table

1.Python使用缩进来组织代码块,坚持使用4个空格的缩进。在文本编辑器中,需要设置把Tab自动转换为4个空格,确保不混用Tab和空格。在7.1版本以及以后Setting->Preference->Language勾选Repalce by space如下图:...

2020-10-21 14:07:27 2079 1

转载 根据前序遍历和中序遍历得到二叉树后续遍历(一看就懂)

文章转载自:https://www.cnblogs.com/jiaxin359/p/9512348.html问题:已知一个二叉树前序遍历为:ABDEGCFH,中序遍历为:DBGEACHF,则该二叉树的后序遍历为?思路是这样的:1:根据前序遍历来确定每次根节点的位置,因为前序遍历先访问的是根节点,所以前序遍历第一个位置就是根节点。 2:根据根节点和中序遍历将树划分为左右两棵树。3:根据第一步和第二步递归的处理左右两棵树。第一步:根据前序遍历A B D E G C F H确定头结点是A,根据中序..

2020-10-21 09:08:57 2115 1

原创 二叉树的动态创建(#号法)和遍历

二叉树每个结点最多有2个孩子,所以为它设计一个数据域和2个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。先直接上代码,这里只是实现了二叉树的生成和遍历,生成采用前序遍历,遍历采用三种方法#include<iostream>using namespace std;//二叉树的二叉链表结点结构定义typedef struct BitNode{ int data;//数据域 struct BitNode*lchild, *rchild;//左右孩子指针}BitNod

2020-10-20 20:33:29 1265 1

原创 队列的顺序存储结构

1.算法原理分析如下图2.队列的顺序存储代码要依赖于之前的文章中的seqlist_02.h和seqlist_02.cpp线性表的顺序存储(业务结点和算法逻辑分离)seqqueue.h如下:#ifndef _MY_SEQQUEUE_H_#define _MY_SEQQUEUE_H_typedef void SeqQueue;//创建队列 SeqQueue* SeqQueue_Create(int capacity);//销毁 队列 void SeqQueue_De.

2020-10-16 13:44:43 401

LocationNavigate.dll

由于notepad++在看代码的时候搜素完函数之后,不能后退到之前看的代码,很不方便,所以上传这个插件,这个插件放到 notepad++安装目录里的 plugins文件夹下,比如我的电脑 C:\Program Files (x86)\Notepad++\plugins

2019-09-24

单片机和上位机互发浮点数

原来一直感觉单片机传送浮点数比较费劲,最近好好弄弄,其实没有那么复杂,不用了解浮点数是怎么存储的,知道占用4个字节就可以了!

2016-04-19

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除