c++
文章平均质量分 69
J.Kuchiki
这个作者很懒,什么都没留下…
展开
-
【C与C++的相互调用方法】
对于C调用C++的情况,没有。原创 2023-08-17 16:18:48 · 2913 阅读 · 0 评论 -
【消息队列】
消息队列(Message Queue)是一种用于在分布式系统中进行异步通信的通信模型。它允许应用程序通过发送和接收消息来实现解耦和异步通信,从而实现系统间的解耦和高可伸缩性。生产者(Producer)和消费者(Consumer)。生产者负责将消息发送到消息队列,而消费者则负责从消息队列中接收并处理消息。消息队列会保存消息,直到消费者准备好处理它们。消息队列还可以具有一些其他的特性,例如持久化消息确认机制消息优先级消息过期等。原创 2023-04-06 17:07:32 · 388 阅读 · 1 评论 -
【共享内存】
共享内存是一种进程间通信(IPC)的机制,允许不同的进程共享同一块内存区域。这样,多个进程可以同时访问和修改共享内存中的数据,从而达到数据共享的目的。共享内存通常由一个进程创建,并通过特定的系统调用将其附加到其他进程的地址空间中。进程可以通过读写共享内存中的数据来进行通信和同步。由于共享内存的访问速度非常快,因此它是一种高效的进程间通信机制。但是,由于多个进程可以同时访问和修改共享内存中的数据,因此需要特殊的同步机制来避免数据竞争和其他并发问题。常见的同步机制包括信号量、互斥量和条件变量等。原创 2023-04-05 21:47:53 · 1200 阅读 · 1 评论 -
【指针函数和函数指针】
函数指针和指针函数是两个不同的概念。函数指针是指一个指针变量,该指针变量存储了一个函数的地址。通过函数指针可以实现动态调用函数,根据需要在程序运行时指定要调用的函数。函数指针的声明方式返回类型 (*指针变量名)(参数列表)。指针函数则是指一个返回指针的函数,即函数的返回值是一个指针类型。返回类型 (*函数名)(参数列表)。因此,函数指针和指针函数的区别在于它们的返回值类型和声明方式不同。函数指针存储了一个函数的地址,可以用来动态调用函数;指针函数则是一个返回指针的函数,可以返回指向某个数据类型的指针。原创 2023-04-01 15:46:09 · 402 阅读 · 0 评论 -
有名管道----mkfifo函数的使用
函数功能:创建有名管道。。参数1(filename):是将要在文件系统中创建的一个专用文件。参数2(mode):用来规定FIFO的读写权限。函数返回值:成功返回0,失败返回-1。。原创 2023-03-14 21:25:08 · 2543 阅读 · 0 评论 -
【工厂方法模式】
由于简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。 工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。本节来分析其基本结构和实现方法。工厂方法模式的主要角色如下。优点和缺点优点:缺点:...原创 2022-06-15 16:31:35 · 206 阅读 · 0 评论 -
【简单工厂模式】
简单工厂模式定义为:简单工厂模式又称为静态工厂方法模型,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式包含如下角色:1.Factory(工厂角色) 工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产原创 2022-06-15 16:08:39 · 211 阅读 · 0 评论 -
【合成复用原则】
合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用功能的目的。简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承。 通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的内部细节通常对子类来说是可见的,所以这种复用又称“白箱”复用,如果基类发生改变,那么子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,原创 2022-06-15 15:30:34 · 614 阅读 · 0 评论 -
【迪米特法则】
迪米特法则又叫做最少知道原则,就是说一个对象应当对其它对象有尽可能少的了解,不要和陌生人说话。 强调只和朋友说话,不和陌生人说话。这里的朋友指的是:出现在成员变量,方法输入,输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。 迪米特法则初衷在于降低类之间的耦合。由于每个类尽量减少对其它类的依赖,因此。很容易使得系统的功能模块独立,相互之间不存在(或很少有)依赖关系。 设想这样一个案例,假如要买房,目前有A、B两套房,分别是高品质和低品质,购房者直接和这两套房打交道,购买符合自己原创 2022-06-15 15:08:55 · 231 阅读 · 0 评论 -
【开闭原则】
开闭原则(Open Closed Principle)是编程中最基础、最重要设计原则一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。 以下是构造了一个计算器,它具有最基本的加、减、乘、除的功能。运行虚函数的方法使得计算机是一个纯虚父类,使用时使用父类指针指向子类,直接使用父类指针调用计算原创 2022-06-15 14:52:09 · 227 阅读 · 0 评论 -
C++11中时间库chrono的使用
C++11为我们提供了三种时钟类型:system_clock、steady_clock、high_resolution_clock。这三个时间类都提供了rep(周期)、period(单位比率)、duration(成员类型)。这三个时钟类都提供了一个静态成员函数 now() 用于获取当前时间,该函数的返回值是一个 time_point 类型。注意: 虽然这三个时钟都很多相同的成员类型和成员函数,但它们是没有亲缘关系的。这三个时钟类型都是类,并非模板类。结果:注意:不要将steady_clock、h原创 2022-06-06 15:22:57 · 2951 阅读 · 0 评论 -
最长公共子序列
最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = "abcde",原创 2022-05-12 19:26:53 · 148 阅读 · 0 评论 -
最长回文子序列
最长回文子序列 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例 1:输入:s = "bbbab"输出:4解释:一个可能的最长回文子序列为 "bbbb" 。示例 2:输入:s = "cbbd"输出:2解释:一个可能的最长回文子序列为 "bb" 。解题思路:动态规划定义状态:dp[i][j] 表示 s 的第 i 个字符到第 j 个字符组成的子串中,最长的回文序列长原创 2022-05-12 14:25:26 · 554 阅读 · 0 评论 -
最长回文串
最长回文串 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。示例 1:输入:s = "abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。示例 2:输入:s = "a"输入:1示例 3:输入:s = "bb"输入: 2解题思路:贪心法首先通过对回文性质的分析可以发现,若字符串中某一个字符出现的数量为偶数原创 2022-05-12 10:07:26 · 978 阅读 · 0 评论 -
用两个栈实现一个队列
用两个栈实现一个队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue","deleteHead","a原创 2022-05-10 20:33:27 · 198 阅读 · 0 评论 -
最小高度树
最小高度树题目描述: 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。原题链接示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 题解:(数组切割+递归)思路分析: 那如何保证高度最小呢?当树中的任意结点的左右子树高度差都不超过 1 时,整棵树的深原创 2022-05-05 20:15:23 · 154 阅读 · 0 评论 -
二叉树枝剪
二叉树枝剪题目描述: 给定一个二叉树 根节点 root ,树的每个节点的值要么是 0,要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。节点 node 的子树为 node 本身,以及所有 node 的后代。原题链接示例 1:输入: [1,null,0,0,1]输出: [1,null,0,null,1] 解释: 只有红色节点满足条件“所有不包含 1 的子树”。右图为返回的答案。示例 2:输入: [1,0,1,0,0,0,1]输出: [1,null,1,null,1]示原创 2022-05-04 21:23:06 · 150 阅读 · 0 评论 -
【约瑟夫环问题】
约瑟夫环问题问题描述题目描述:解题方法一:数学推导法方法二:使用队列问题描述 约瑟夫环问题为:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)本文以Leetcode的一道题目为例进行说明:1823. 找出游戏的获胜者题目描述: 共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位原创 2022-05-04 20:39:28 · 693 阅读 · 0 评论 -
平衡二叉树
平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1:输入:root = [3,9,20,null,null,15,7]输出:true示例 2:输入:root = [1,2,2,3,3,null,null,4,4]输出:false示例 3:输入:root = []输出:true解题:方法一:自顶向下的递归class Solution {public:原创 2022-05-03 21:35:31 · 124 阅读 · 0 评论 -
重建二叉树
重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例 1:Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]示例 2:Input: preorder = [-1], inorder = [-1]Output: [-1]解题:(递归)/** * Definition for原创 2022-05-03 21:13:22 · 69 阅读 · 0 评论 -
【用C语言实现线程池】
用C语言实现线程池线程池原理线程池的组成结构任务队列工作的线程管理者线程代码实现线程池原理 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢? 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启转载 2022-04-27 15:34:57 · 6166 阅读 · 5 评论 -
【智能指针】
智能指针转载:https://blog.csdn.net/TABE_/article/details/117391903转载 2022-04-22 20:50:13 · 106 阅读 · 0 评论 -
【C++可变参数宏__VA_ARGS__】
C++可变参数宏__VA_ARGS__ 之前我们学习了C++中的可变参数,但是可变参数还是只能应用在真正的函数中,不能使用在宏中。而在C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。 可变参数宏有如下几种定义:#define DEBUG(format, ...) printf (format, __VA_ARGS__)#define DEBUG(format, args...) printf (forma原创 2022-04-22 20:21:22 · 4263 阅读 · 0 评论 -
【c++里的可变参数】
c++里的可变参数 在c++编程中,有时我们需要编写一些在源代码编写阶段无法确定参数个数,有时甚至无法确定参数类型的函数。 如果想通过一个同名函数实现多个参数相加的操作,我们首先会想到通过函数重载来实现,例如:int sum(int i1, int i2);int sum(int i1, int i2, int i3);...//还可以重载更多类似函数但如果参数的个数无法确定呢,我们不可能对每一种情况都进行重载。那么,需要的是这样一类函数:它们可以在运行时取任意的实参个数并根据实参的个数自原创 2022-04-22 19:39:11 · 3501 阅读 · 0 评论 -
【堆排序(Heapsort)】
堆排序(Heapsort)基本思想算法流程(大根堆)代码实现实验结果算法分析基本思想 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:(1) 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;(2) 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;算法流程(大原创 2022-04-19 17:06:37 · 303 阅读 · 0 评论 -
【快速排序(Quicksort)】
快速排序(Quick Sort)基本思想算法流程代码实现基本思想 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出。算法流程其主要流程如下:(1) 首先设定一个分界值,通过该分界值将数组分成左右两部分。(2) 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。(3) 然后,左边和右边的数据可以独原创 2022-04-19 14:25:24 · 567 阅读 · 0 评论 -
【插入排序(Insertionsort)】
插入排序(Insertion Sort)直接插入排序基本思想代码实现结果输出算法分析 插入排序分为直接插入排序、折半插入排序、希尔排序(shell sort),后两种是在直接插入排序的改进上而来。本文主要介绍直接插入排序算法。直接插入排序基本思想 假设待排序的元素存放在数组A[1..n]A[1..n]A[1..n]中,在排序过程的某一时刻,A被划分为两个子区间A[1..mid]A[1..mid]A[1..mid]和A[mid+1..n]A[mid+1..n]A[mid+1..n],其中前一个子区原创 2022-04-19 10:10:35 · 760 阅读 · 0 评论 -
【希尔排序(Shellsort)】
希尔排序(Shell Sort)一、基本思想二、算法实现代码实现结果输出算法分析一、基本思想 希尔排序算法严格来说是基于插入排序的思想,又被称为“缩小增量排序”。它属于插入排序的一种,但是相对于直接插入而言又有了很大的改进。直接插入排序在对几乎已经排好序的数据进行操作时,效率比较高,但是又因为直接插入排序每一次只能移动一位数据,所以说是低效的排序算法。希尔排序针对直接插入排序的这些特点进行了相对的改进。 希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组原创 2022-04-18 20:37:54 · 854 阅读 · 0 评论 -
【epoll的使用】
epoll的使用epoll的作用:(实现I/O的多路复用)epoll操作的相关函数实际案例 本文整理了epoll相关的知识点以供后续的学习和查阅。epoll的作用:(实现I/O的多路复用) 多路复用I/O就是我们说的select,poll,epoll等操作,复用的好处就在于单个进程就可以同时处理 多个 网络连接的I/O,能实现这种功能的原理就是select、poll、epoll等函数会不断的 轮询它们所负责的所有 socket ,当某个socket有数据到达了,就通知用户进程。 在linux的原创 2022-04-17 16:23:15 · 1417 阅读 · 1 评论 -
【指针常量和常量指针的区别】
指针常量和常量指针的区别指针常量常量指针指针常量 指针常量可以理解为——指针类型的常量,顾名思义,指针常量实际上为一个常量,只不过是指针类型修饰的。格式:int* const p //指针常量案例:int a = 1;int b = 2;int* const p = &a;cout << "a的地址:" << &a << endl;cout << "p的地址:" << p << endl;cou原创 2022-04-16 19:27:47 · 355 阅读 · 0 评论 -
【无重复字符的最长子串】
无重复字符的最长子串题目要求:给定一个字符串 sss,请你找出其中不含有重复字符的最长子串的长度。示例 1:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是原创 2022-04-15 20:46:27 · 49 阅读 · 0 评论 -
【遍历二叉树】
遍历二叉树二叉树的先序遍历方法一:递归方法二:迭代二叉树的中序遍历方法一:递归方法二:迭代二叉树的后序遍历方法一:递归方法二:迭代二叉树的先序遍历方法一:递归思路与算法: 首先我们需要了解什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。代码实现(c++):class Solution {public: void原创 2022-04-13 21:33:19 · 397 阅读 · 0 评论 -
【C++静态成员函数不能调用非静态成员变量】
C++静态成员函数不能调用非静态成员变量静态成员函数this指针C++静态成员函数不能调用非静态成员变量原因为什么要引入static什么时候用static致谢静态成员函数定义:静态成员函数就是在声明时前面加了 static 关键字的成员函数。 其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非静态成员函数是针对类的对象而言。 然而从本质上来说类的静态原创 2022-04-13 16:21:54 · 5042 阅读 · 2 评论 -
【分割等和子集】
分割等和子集此题来源于力扣(分割等和子集)题目要求:给你一个 只包含正整数的非空数组nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。示例 2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。解题思路:(动态规划)一. 转换为 「0 - 1」 背包问题 这道题可以换一种表述:给定一原创 2022-04-10 21:35:59 · 524 阅读 · 0 评论 -
浅拷贝和深拷贝
【c++】浅拷贝和深拷贝浅拷贝深拷贝何时需要重写拷贝构造函数: 当我们对一个对象进行拷贝操作时,如果我们没有自己定义拷贝函数,那么便会执行默认的拷贝函数。浅拷贝 是由缺省的拷贝构造函数所实现的数据成员逐一进行赋值,如果类中含有指针则会产生错误。 在浅拷贝中,拷贝出的新的函数对象与原本函数对象的指针变量地址指向同一位置。例如如下代码所示的案例:#include <iostream>#include <string>#include <cstdlib>u原创 2022-04-08 14:10:47 · 70 阅读 · 0 评论