自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 问答 (2)
  • 收藏
  • 关注

原创 C语言一元多项式相加(链表)

今天写一个关于一元多项式相加的程序,就当是在练习运用一下链表的知识。首先,我们先来分析一波,一元多项式相加,首先要用链表创建两个或多个多项式,每个节点里的数据有两个,系数和指数;其次,如果要实现乱幂输入,那么还需要一个排序函数;然后就是多项式相加求和的部分,当指数相等时其系数相加,如果不相等那么就比较大小,依次存入新的链表;最后是输出函数,这个部分也分了很多类型,比如:两式相加为常数(2,4,6)、0、系数为1不显示系数(x,x^4)、指数为1不显示指数(x,2x)等等。先来定义结构体变量,和单链表的定义

2020-10-30 21:10:52 21903 19

原创 C语言创建一个单链表实现键盘输入数据以及增删查

作为一个编程小白,在这里发表自己的第一篇博客,心里还是有点紧张。写博客的目的主要还是在于让自己对所学的知识进行充分的掌握,企图在写分析的过程当中可以达到“柳暗花明又一村”的境界,当然如果可以帮助到别人的话自己心里也肯定有辣么一点点成就感。 因为刚接触到链表,所以今天就想和大家一起探讨一下链表。想弄清楚链表,对指针的概念一定要很清楚。我们都知道,链表是由一个又一个节点构成,每个节点又分为数据域和指针域(eg:p->data/p->next)。 ![在这里插入图片描述](https://img.

2020-10-18 17:14:56 16089 8

原创 Linux-System V共享内存

共享内存是所有IPC中最快的一种。它之所以快是因为共享内存一旦映射到进程的地址空间,进程之间数据的传递就不需要涉及内核了。发送信息的一方,通过系统调用(write或msgsnd)将信息从用户层拷贝到内核层,由内核暂存这部分信息。提取信息的一方,通过系统调用(read或msgrcv)将信息从内核层提取到应用层。建立共享内存之后,内核完全不参与进程间的通信,这种说法严格来讲并不是正确的。因为当进程使用共享内存时,可能会发生缺页,引发缺页中断,这种情况下,内核还是会参与进来的。

2024-04-21 17:48:51 1071

原创 Linux-System V信号量

因为信号量集中可能存在多个信号量,需要用这个参数来告知semop函数要操作的是哪个信号量,0表示第一个信号量,1表示第二个信号量,依此类推,最大为nsems-1,即不得超过集合中信号量的个数。semop函数每次会操作一组信号量,每个信号量由一个sembuf来表示,修改一个信号量最好也将其定义成struct sembuf ops[1]这样的数组,semop函数的第三个参数表示要操作的信号量的个数。第二,允许同时管理多种资源,由多个计数信号量组成的一个集合称为计数信号量集,每个计数信号量管理一种资源。

2024-04-21 13:32:21 985

原创 Linux-进程间通信:System V消息队列

System V IPC未遵循“一切都是文件”的Unix哲学,而是采用标识符ID和键值来标识一个System V IPC对象。System V IPC对象的作用范围是整个操作系统,内核没有维护引用计数。调用各种get函数返回的ID是操作系统范围内的标识符,对于任何进程,无论是否存在亲缘关系,只要有相应的权限,都可以通过操作System V IPC对象来达到通信的目的。System V IPC对象具有内核持久性。

2024-04-20 15:44:45 1148

原创 Windows下使用CMake生成并使用动态库

_declspec__declspec生成的动态库和静态库在build/Debug目录下。

2024-04-20 11:45:35 150

原创 Linux-管道

在没有进程以写模式(O_RDWR或O_WRONLY)打开FIFO文件的情况下,以O_RDONLY模式打开一个FIFO文件时,调用进程会陷入阻塞,直到另一进程以O_WRONY(或者O_RDWR)的标志位打开该FIFO文件为止。同样的道理,在没有进程以读模式(O_RDONLY或O_RDWR)打开FIFO文件的情况下,如果一个进程以O_WRONLY的标志位打开一个FIFO文件,调用进程也会阻塞,直到另一个进程以O_RDONLY(或者O_RDWR)的标志位打开该FIFO文件为止。

2024-04-15 21:51:20 761

原创 Linux-线程知识点(2)

在上面的例子中,nanosleep是取消点,如果线程执行到此处时被其他线程取消,就会出现以下情况:互斥量还没有解锁,但持有锁的线程已不复存在。假设遇到取消请求,线程执行到了取消点,却没有来得及做清理动作(如动态申请的内存没有释放,申请的互斥量没有解锁等),可能会导致错误的产生,比如死锁,甚至是进程崩溃。NPTL提供了函数来设置线程是否允许取消,以及在允许取消的情况下,如何取消。PTHREAD_CANCEL_DEFERRED是延迟取消,线程会一直执行,直到遇到一个取消点,这种方式也是新建线程的默认取消类型。

2024-04-15 19:09:42 1051

原创 Linux-线程知识点

POSIX函数函数功能描述创建一个线程退出线程获取线程ID检查两个线程ID是否相等等待线程退出设置线程状态为分离状态线程的取消设置线程的名称线程退出,清理函数注册和执行线程退出,清理函数注册和执行。

2024-04-06 18:28:03 1126

原创 Linux-exec函数族和system函数

在每个半区之中,带p的表示可以使用环境变量PATH,带e的表示必须要自己维护环境变量,而不使用当前环境变量,首先是效率,使用system运行命令时,一般要创建两个进程,一个是shell进程,另外一个或多个是用于shell所执行的命令。父进程调用fork之后,子进程执行execve函数,抛弃父进程的程序段,和父进程分道扬镳,从此天各一方,各走各路。出错的可能性非常多,手册提供了19种不同的errno,罗列了22种失败的情景。execve函数返回值是特殊的,如果失败,返回-1,但如果成功,永不返回。

2024-04-06 18:17:43 1014

原创 Linux-等待子进程

不过,进程的退出其实并没有将所有的资源完全释放,仍保留了少量的资源,比如进程的PID依然被占用着,不可被系统分配。这些资源不释放是为了提供一些重要的信息,比如进程为何退出,是收到信号退出还是正常退出,进程退出码是多少,进程一共消耗了多少系统CPU时间,多少用户CPU时间,收到了多少信号,发生了多少次上下文切换,最大内存驻留集是多少,产生多少缺页中断?对于第二种情况,如果父进程先调用wait()函数,此时子进程还没退出,wait()函数就会阻塞在这里,直到某个子进程退出。成功时,返回已退出子进程的进程ID;

2024-04-05 14:06:49 951

原创 Linux-守护进程

守护进程是Linux中的后台服务进程,是一个生存周期较长的进程,通常独立于终端并且周期性的处理某些任务或者等待处理某些发生的事情。守护进程是一个特殊的孤儿进程,这种进程脱离终端,是为了避免被终端的任何信息所打断,其执行过程中也不会在任何终端显示信息。既然如此,为了确保万无一失,只有确保守护进程不是会话的首进程,才能保证打开的终端设备不会自动成为控制终端。即使守护进程是从终端命令行启动的,终端相关的信号如SIGINT、SIGQUIT和SIGTSTP,以及关闭终端,都不会影响到守护进程的继续执行。

2024-04-05 13:53:35 863

原创 Linux的软链接和硬链接

概念:硬链接只是在文件系统中创建的一个原文件的副本,它拥有与原文件相同的内容和权限。概念:给文件创建一个快捷方式,依赖原文件,和普通文件没有区别。创建:ln -s 原文件 软链接名称。注意:创建软链接最好用绝对路径。创建:ln 原文件 硬链接名称。

2024-04-04 10:26:16 605

原创 Linux制作C++静态库和动态库并使用示例

这样就完成了在Linux下创建和使用动态库的过程。需要注意的是,在运行时,系统需要能够找到动态库,可以通过将动态库路径加入到LD_LIBRARY_PATH环境变量中,或者将动态库拷贝到系统默认的库路径中。编写源文件: 创建你的C/C++源文件(例如,example.c或example.cpp),并编写相应的代码。其中,-L 用于指定库文件的路径,-l 用于指定要链接的库(注意不需要写lib前缀和.so后缀)。其中,-L 用于指定库文件的路径,-l 用于指定要链接的库(注意不需要写lib前缀和.a后缀)。

2024-04-04 10:18:48 593

原创 基于muduo网络库实现的集群聊天服务器

1、使用muduo网络库作为项目的网络核心模块,提供高并发网络IO服务,解耦网络和业务模块代码;2、使用json序列化和反序列化消息作为私有通信协议;3、配置nginx基于tcp的负载均衡,实现聊天服务器的集群功能,提高后端服务的并发能力;4、基于redis的发布-订阅功能,实现跨服务器的消息通信;5、使用mysql关系型数据库作为项目数据的落地存储;6、使用连接池提高数据库的数据存取功能。

2024-04-01 00:05:26 924

原创 Linux下安装MySQL

2、如果没有,查看防火墙开放端口。1、查看mysql是否在工作。5、重新登录mysql。4、重新加载配置文件。

2024-03-31 18:01:22 411

原创 Linux下开发调试C++代码的三种方法

关于这三种调试方法的示例都是基于cmake开发下,也适用不用cmake开发的情况,就不一一演示了,道理都是相通的。

2024-03-31 12:39:04 863

原创 Linux安装Nginx及配置TCP负载均衡

可执行文件在sbin目录下,配置文件在conf目录下的nginx.conf。编译完成后,默认安装在了/usr/local/nginx目录。1、首先使用命令查看当前Linux下所有的TCP连接。打开conf/ngnix.conf文件。可以发现Nginx没有启动。3、Nginx的其他命令。添加红色方框内的配置。

2024-03-23 23:30:04 749

原创 Qt播放音乐代码示例

点击play按钮播放或暂停音乐,拖动进度条,音乐对应播放。

2024-03-23 23:20:18 334 1

原创 基于C++和Qt Creator实现的仿制网易云音乐播放器

仿照网易云播放器界面实现,目的在于锻炼C++编程能力,学习Windows下Qt Creator各种组件的使用及样式设置、界面布局、QtPlugin技术、QXml读写XML文件方法、Qss文件的编写及使用等。

2024-03-10 20:55:50 735

原创 C++数据结构-广义表

如果允许表中的数据元素具有自身结构,即数据元素也可以是一个线性表,这就是广义表,有时也称之为列表(Lists)。广义表是n(n≥0)个元素a1, a2, …, an的有限序列,即LS=(a1, a2, …, an)。其中,LS是广义表的名称,n是它的长度。ai可以是单个元素,也可以是广义表。若ai是单个元素,则称它是广义表LS的原子;若ai是广义表,则称它为LS的子表。当LS非空时,称第一个元素a1为LS的表头(Head),其余元素组成的表(a2, a3,…, an)为表尾(Tail)。

2024-01-03 01:05:54 752 2

原创 C++数据结构队列

队列也是一种特殊的线性表,是限制在表的一端进行插入和在另一端进行删除的线性表。表中允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。当表中没有元素时称为空队列。队列的插入运算称为进队列或入队列,队列的删除运算称为退队列或出队列。如图所示为队列的入队列和出队列的过程示意图,入队列的顺序是e1、e2、e3、e4、e5,出队列的顺序为e1、e2、e3、e4、e5,所以队列又称为先进先出线性表(First In First Out),简称FIFO表。其特点是先进先出或者后进后出。

2024-01-01 23:27:01 1035 1

原创 C++数据结构-栈

利用顺序存储方式实现的栈称为顺序栈。类似于顺序表的定义,要分配一块连续的存储空间存放栈中的元素,栈底位置可以固定地设置在数组的任何一端(一般在下标为0的一端),而栈顶是随着插入和删除而变化的,再用一个变量指明当前栈顶的位置(实际上是栈顶元素的下一个位置)。否则,由于栈的top 指向栈顶元素的后一位置,要先修改top为top-1,再将其所指向的元素以引用参数_stu返回,成功返回true。否则,由于栈的top 指向栈顶元素的后一个位置,将入栈元素赋到top的位置,再将top+1指向新的位置,成功返回1。

2024-01-01 15:30:18 1122 1

原创 C++线性表

线性表是一种最简单、最基本也是最常用的线性结构。在线性结构中,数据元素之间存在一个对一个的线性关系,数据元素“一个接一个地排列”。在一个线性表中,数据元素的类型是相同的,或者说,线性表是由同一类型的数据元素构成的。在实际问题中,线性表的例子很多,如学生自然情况信息表、工资信息表等都是线性表。线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,通常记为:(a1,a2, …, ai-1, ai, ai+1, …, an)。其中,n为数据元素个数,称为表长。当n=0时称为空表。

2023-12-30 17:42:19 999 2

原创 C++11的lambda表达式

Lambda表达式是一种匿名函数,允许我们在不声明方法的情况下,直接定义函数。它是函数式编程的一种重要特性,常用于简化代码、优化程序结构和增强代码可读性。在lambda函数的定义中,和都是可选的部分,而和都可能为空。那么在极端情况下,C++11中最为简略的lambda函数只需要声明为[]{};就可以了。不过理所应当地,该lambda函数不能做任何事情。

2023-12-27 18:47:31 1547 1

原创 C++的多继承和虚继承

C++支持多继承,即一个派生类可以有多个基类。很多时候,单继承就可以满足开发需求,但在特定的情况下就不行。比如有两个类A和B,现在要有一个类C,它同时具有A和B的属性和行为,这种情况下单继承就不能满足要求。从形态学上来讲,鸭嘴兽应该属于鸟类,原因是鸭嘴兽具有扁平的、像鸭子一样的嘴巴,而且是角质的,不像哺乳动物那种肉质的口唇,关键是鸭嘴兽通过下蛋来繁殖后代,这明显是鸟类的特征。然而,鸭嘴兽也靠乳汁来哺育幼仔,浑身密布着浓褐色的短兽毛,这又是哺乳动物的重要特征。所以鸭嘴兽既是鸟类,又是哺乳动物。

2023-12-26 17:55:05 949 1

原创 使用Qt制作网易云播放器的歌曲排行界面

本篇的目的就是介绍红色方框的界面怎么做。代码非常简单,就不详细介绍了。网易云排行榜的歌曲排行界面。

2023-12-15 01:03:20 739 2

原创 C++的移动语义和完美转发

std::move()内部是用static_cast做类型转换,只不过它是使用模板实现的函数,因此会根据传参类型自动推导返回值类型,省去了指定类型的代码。

2023-12-13 02:03:09 1033 2

原创 C++的左值、右值、左值引用和右值引用

因为非常量左值无法引用MakeMyClass()返回的右值,所以常量左值引用右值是一条非常棒的特性,但是也有弊端。在上面的代码中,x++是一个右值,++x是一个左值。因为对于后置++,编译器会生成一份x的临时复制,然后才对x自增,返回临时复制的内容,所以后置++是右值。左值引用的出现使C++编程脱离了使用指针的危险,当我们需要将一个对象作为函数的参数时,会使用左值引用,这种方式会免去创建临时对象的操作。对于get_val函数,x作为全局变量是一个左值,但在返回x值时编译器会产生一份x的临时复制,还是右值。

2023-12-12 22:57:33 888

原创 C++之函数指针

使用回调函数的主要目的是实现代码的灵活性和扩展性,将某个需要在特定事件发生时执行的函数的执行权交给另一个函数。通常,回调函数包括两个步骤:首先,程序需要定义一个回调函数,然后,程序中的某个部分会使用这个回调函数,在特定情况下触发执行。函数指针的主要作用是实现回调函数,在程序运行时动态地将某个函数的执行权传递给另一个函数。函数指针常被用于回调函数,回调函数是一种在程序运行过程中通过函数指针来实现的函数调用方式。它的基本思想是将一个函数的地址作为参数传递给另一个函数,在合适的时候调用这个函数来完成一定的任务。

2023-12-11 19:20:49 384 2

原创 C++之友元

一般情况下应当把类的数据成员设置为private以限制外部的访问。不过这样也有局限性,必须为所有外部可能用到的变量添加存取函数(Set、Get),即使只有一个外部函数会用到这个成员变量。因此可以适当地让某些外部函数可以访问私有变量。在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时阻止一般的访问,这就是友元。友元机制允许一个类将其非公有成员的访问权限授予指定的函数或类。友元的声明以关键字friend开始,它只能出现在类定义的内部。友元的声明可以出现在类的任何地方,并且不受访问控制的权限的影响。

2023-12-07 16:39:47 541 2

原创 C++_Primer_Plus之操作符重载

C++允许程序与重载操作符,从而定义自己的操作符的行为。重载操作符可以是类成员函数或全局函数。C++允许将操作符重载扩展到用户定义的类型,例如,允许使用+将两个对象相加。编译器将根据操作数的数目和类型决定使用哪种加法定义。i < 10;i++)但是通过重载+操作符,我们就可以这样写a = b + c;这种简单的加法表示法隐藏了内部机理,并强调了实质,这是OOP的另一个目标。要重载操作符,需要使用被称为操作函数的特殊函数形式。其中,op是要重载的操作符。例如:operator +()重载+操作符、

2023-12-07 00:19:43 989

原创 命令模式-C++实现

可以看到,我们先设置命令为打开电灯,按下按钮,电灯已经打开,执行撤销方法,电灯就被关闭,然后我们设置命令为关闭电灯,执行撤销方法,电灯就被打开。4、接口隔离原则:命令模式通过抽象命令和具体命令的设计,可以将不同的请求封装成不同的命令类,从而避免大量的接口在同一个类中定义。1、抽象命令:它定义了执行操作的接口,包含一个执行方法和一个可选的撤销操作,这里的撤销是撤销命令,恢复成上一个命令执行的结果。3、里氏替换原则:命令模式中的具体命令类是抽象命令的子类,因此可以通过具体命令类的替换来扩展和改变命令的行为。

2023-12-03 22:11:42 1135 2

原创 职责链模式-C++实现

将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理请求为止,也就是说如果当前对象不处理请求,那就继续向前传递。2、具体处理者(ConcreteHandler):实现处理请求的接口,处理自己负责的请求,如果自己无法处理,则将请求传递给下一个处理者。1、解耦请求发送者和接收者:请求发送者无需直到具体哪个处理者处理请求,只需要把请求发送给第一个处理者,之后就通过链式传递处理请求。1、无法保证请求一定会被处理:如果职责链上的节点都无法处理这个请求,那么这个请求就会被忽略。

2023-12-03 15:51:42 497

原创 迭代器模式-C++实现

在代码中,我们定义了一个Iterator接口,其中包含了Next()和Empty()方法,分别用于获取下一个元素的数据和判断是否还有下一个元素。因为传统的迭代器模式是多态的形式,也就是运行时多态,运行时多态我们需要去访问虚函数表找到要执行的函数地址,在这种情况下当我们的元素有一百万个时,遍历元素就会很慢,完全没必要。测试代码中,我们创建一个聚合对象,并插入了5个元素,然后又创建了一个迭代器的对象,通过迭代器遍历元素并输出。3、抽象聚合对象:定义一个迭代器工厂方法,用于创建一个具体迭代器的实例。

2023-12-03 12:47:03 536

原创 组合模式-C++实现

组合模式的核心思想是将对象组织成树状结构,其中单个对象和组合对象都实现了相同的接口或者继承相同的抽象类,这样可以使客户端以递归的方式处理整个对象树,不需要关心处理的节点是叶子节点还是组合节点。1、单一职责原则 (Single Responsibility Principle):文件类只负责输出自己的文件名,目录类负责输出自己的目录名和其子节点的所有名称,即每个类应该只有一个责任。3、对象层次结构的一致性:组合模式让单个对象和组合对象具有相似的操作,使得整个对象层次结构更加统一。测试代码中,我们创建了一个。

2023-12-02 23:40:13 668 2

原创 备忘录模式-C++实现

最后创建了一个备忘录管理者对象,用于管理所有发起人创建的备忘录对象,实现的方法有添加备忘录对象、从备忘录管理列表里取出一个对象。它将对象的内部状态保存到备忘录对象中,并在需要的时候从备忘录中取出恢复状态,实现了状态的保存和恢复。1、状态保存和恢复:备忘录模式可以通过在发起人类和备忘录类之间引入备忘录对象,实现对象状态的保存和恢复。2、简化发起人类:因为备忘录模式可以减轻发起人类的负担,因为它把发起人类的状态保存和恢复委托给了备忘录类和备忘录管理者类,这样使得发起人类更加简单并且易于维护。

2023-12-02 15:37:58 628

原创 状态模式-C++实现

根据输出我们可以发现在不同的状态下它们的行为也是不同的,比如在订单待处理状态下:订单可以取消、可以即将处理、但是没有送达;状态模式是一种行为型设计模式,它允许对象内部状态发生改变时改变其行为,它将行为封装在不同的状态对象中,在运行时通过切换不同的状态可以表现出不同的行为。4、提供了一种简洁的方式来配置对象的状态流转:状态模式将对象的状态流转逻辑集中在状态类中,使得状态的变化更加可见和易于管理。2、支持开闭原则:通过添加新的状态类或修改现有状态类的行为,可以方便地扩展和修改对象的行为,而不会影响其他代码。

2023-12-01 19:35:54 1134 1

原创 中介模式-C++实现

中介对象充当了对象间的协调者将对象之间的交互转换为与中介对象的交互,从而降低了对象之间的复杂性。2、中介者对象可能会变得过于“智能”:作为一个统一管理所有对象的管理器,中介者对象需要对所有对象非常了解,从而做出正确的决策,这可能会导致中介者对象变得过于“智能”,代码实现复杂,难以理解和维护。2、增强了系统的可扩展性和灵活性:通过中介者对象,我们可以很灵活的引入一个新的同事类,只需要把它添加到中介者对象维护的一个同事类列表中即可,无需修改现有代码。2、具体中介者:实现抽象中介者定义的接口。

2023-12-01 16:57:27 428

原创 适配器模式-C++实现

在类适配器模式中,适配器类即继承目标类,又继承适配者类,从而能够调用适配者类的方法,并将其适配到目标类身上。相比之下,对象适配器更加灵活,因为它是继承目标类、定义适配者对象,在目标类方法中调用适配者对象的方法,这种方法支持我们可以适配多个适配者类(也就是定义多个适配者类),所以更加灵活。2、系统的解耦:适配器模式将客户端和适配者类进行解耦,使得客户端不需要关心具体适配者类的实现细节。2、关系:对象适配器通过持有适配者对象的引用来连接适配器与适配者,类适配器通过同时继承目标类和适配者类来连接适配器与适配者。

2023-11-29 23:47:04 886

空空如也

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

TA关注的人

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