自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 【第十五届蓝桥杯大赛软件赛省赛】———— C/C++ 大学B组

蓝桥杯2024年15届省赛b组原题献上

2024-04-15 16:47:31 1167

原创 unique_ptr的常用操作详解——(C++11智能指针)

在C++中,动态内存的使用很容易出问题,因为要确保在正确的时间释放内存是极其困难的。有时会忘记释放内存,在这种情况下会产生内存泄露;有时在尚有指针引用内存的情况下就释放了它,在这种情况下就会产生引用非法内存的指针。C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。

2024-04-15 16:24:38 718

原创 bind包装器——C++新特性(三)

std::bind 函数定义在头文件 functional 中,是一个函数模板,它也有点像上面的包装器(适配器),接受一个可调用对象(函数/函数名、仿函数对象、lambda 表达式),然后生成一个新的可调用对象来“适应”原对象的参数列表。具体说的话,bind 可以去给可调用对象(通常是静态成员函数)参数列表中的参数指定缺省值,或者更改形参的接收顺序,然后生成一个新的可调用对象来“适应”原对象的参数列表。它可以接受一个可调用对象,生成一个新的可调用对象来 “ 适应 ” 原对象的参数列表,

2024-04-14 20:34:55 490 1

原创 Linux网络基础 (二) ——(IP、MAC、端口号、TCP&UDP协议、网络字节序)

网络通信是极其复杂的,在信息的交互过程中仅仅知道目的IP地址是不够的,当对端主机收到该数据后,对端主机还需要对该主机做出响应,因此对端主机也需要发送数据给该主机,此时对端主机就必须知道该主机的IP地址。,因此当数据跨网络到达下一个局域网时,其源MAC地址和目的MAC地址就需要发生变化,因此当数据达到路由器时,路由器会将该数据当中链路层的报头去掉,然后再重新封装一个报头,此时该数据的源MAC地址和目的MAC地址就发生了变化。但是以现在的网络的发展,通信设备的增加,IPv4 的地址是完全不够用的。

2024-04-14 19:40:01 1027

原创 Linux网络基础 (三) —— Socket

  Socket(套接字)是一种用于实现网络通信的编程接口(API),它提供了一种标准化的方式,使得不同操作系统和编程语言之间的应用程序能够相互通信。Socket最初是在BSD(Berkeley Software Distribution)操作系统中开发出来的,目的是为了实现在不同主机之间进行进程间通信。BSD是由加州大学伯克利分校开发的一个Unix操作系统的分支,它对Socket的定义和实现成为了事实上的标准。后来,由于互联网的发展,Socket被广泛应用于网络编程中。  在早期的计算机网络中,通信使用的

2024-04-06 17:03:02 758

原创 function 包装器 ——C++新特性(二)

function是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,本质就是一个类模板

2024-04-06 16:20:23 527

原创 C/C++语言实现简易通讯录 [含文件操作,循环双链表]

本采用c++语言实现的简易通讯录,具体功能包括添加、删除,查找和修改联系人信息,显示和清空联系人列表等基本功能该简易通讯录采用了循环双链表的数据结构,以及文件操作等技术,能够实现对通讯录联系人基本信息的修改与保存登录录入基本信息显示联系人查找联系人修改联系人双链表实现部分注意:这里只给出部分代码,如有需要全部源码链接已在文章开头给出链接ListNode.cppListNode.cppcontact.cpp

2024-03-30 21:02:07 468

原创 Linux网络基础 (一)———基本概念

​ 网络协议是网络上所有设备之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。大多数网络都采用分层的体系结构,每一层都建立在它的下层之上,向它的上一层提供一定的服务,而把如何实现这一服务的细节对上一层加以屏蔽。OSI模型除了比5层协议栈多两层外,其余5层与5层协议栈的同名对应层的定义基本相同。,协议的服务和功能与哪一层的服务和功能相对应,该协议就属于哪一层。我们定义了许多协议。TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

2024-03-30 14:14:13 1075

原创 Linux线程互斥

互斥锁本质上就是一个类(class pthread_mutex_t),可以构造对象pthread_mutex_t mutx,mutx就是互斥锁对象。而为了能让加锁过程是原子的,在大多数体系结构了,都提供了swap或者xchange汇编指令,通过一条汇编指令来保证加锁的原子性。( mutex ),将锁看作一个通行证,持有锁的线程才能进入临界区中执行代码,其他线程不持有锁,无法进入该临界区。同创建线程一样,锁也需要创建,POSIX提供了锁的变量类型,如上面代码所示,其中mutext是互斥量。

2024-03-23 20:55:22 804

原创 lambda表达式——C++新特性(一)

随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。因此,在C++11语法中出现了Lambda表达式。什么是lambada表达式?  “Lambda 表达式”(lambda expression)本质是仿函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction)。lambada表达

2024-03-23 20:28:00 630

原创 Linux进程间通信详解

进程间通信目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。进程间通信发展管道System V进程间通信POSIX进程间通信进程间通信分类管道匿名管道pipe命名管道。

2024-02-25 16:45:57 1067

原创 Linux信号详解

信号是 Linux 操作系统中用于进程间通信、处理异常等情况的一种机制。它是由操作系统向一个进程或者线程发送的一种异步通知,用于通知该进程或线程某种事件已经发生,需要做出相应的处理。信号的作用:进程间通信:进程可以通过向其他进程发送信号的方式进行通信,例如某个进程在完成了某项工作之后,可以向另一个进程发送 SIGUSR1 信号,通知其进行下一步的操作。处理异常。

2024-02-25 12:15:57 1226

原创 动态库和静态库

静态库是函数和数据编译进一个二进制文件里面(.lib文件),在使用静态库链接成可执行程序的时候,链接器会复制静态库内的函数和数据进可执行程序里面(.EXE文件),所以在加载库的时候不需要加载相应的库函数动态库往往是提供两个文件,一个是引入库文件(.lib)和一个DLL(.dll)文件,但是引入库文件(.lib)只是包含DLL文件的导出函数以及函数的变量名符号,而DLL文件里包含了所有的函数以及数据,假如调用动态库是在编译到可执行程序的时候才会调用没有数据以及函数的复制,所以在发产品的时候需要加上相应的动态

2024-01-30 21:55:28 777

原创 数据结构:AVL树详解(平衡二叉树)

假如以 parent 为根的子树不平衡,即 parent 的平衡因子为2或者-2,分以下情况考虑parent的平衡因子为2,说明parent的右子树高,设parent的右子树的根为subR当subR的平衡因子为1时,执行左单旋当subR的平衡因子为-1时,执行右左双旋parent的平衡因子为-2,说明parent的左子树高,设parent的左子树的根为subL当subL的平衡因子为-1是,执行右单旋当subL的平衡因子为1时,执行左右双旋。

2023-11-11 10:05:02 1293

原创 STL:map详解

map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为 pair:在内部,map中的元素总是按照键值key进行比较排序的。

2023-11-09 09:35:30 74

原创 二叉搜索树(二叉排序树、二叉查找树)详细图解+代码

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树

2023-10-27 20:53:06 2129

原创 C++多态(虚表&虚表指针)

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。必须在继承体系下必须通过基类(父类)的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类(子类)必须对基类的虚函数进行重写简单来说,就是在继承体系下用父类的指针调用子类重写的虚函数。概念在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。

2023-10-27 11:17:26 128

原创 Linux进程终止

exit函数的参数是也是当前进程要返回的退出码,可以在任意位置调用,其使用方法与 exit 基本一致,这里不再演示,感兴趣的可以自行演示。exit 函数是用来终止进程的,它会执行一些清理工作(如关闭文件、释放内存等),然后退出程序。exit函数在退出前对其进行处理,将字符串“exit”从数据流中输出。exit函数的参数是当前进程要返回的退出码,该函数可以在任意位置调用。_exit函数直接退出了程序,并没有将字符串“_exit”输出。ps : main函数退出的时候,也会会隐式调用 exit。

2023-10-26 19:41:30 28

原创 Linux gdb用法详解

gdb是linux下非常好用的一个调试工具,由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,gdb 对于一名Linux下工作的c/c++程序员,是必不可少的工具。

2023-10-22 20:10:57 36

原创 C++中的继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄protected:int _stuid;// 学号protected:int _jobid;// 工号。

2023-10-22 14:33:09 28

原创 priority_queue 详解

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。

2023-10-14 10:27:17 326

原创 解决普通用户无法使用sudo指令的问题

关于普通用户无法使用sudo指令的解决方案

2023-09-24 15:35:20 1880

原创 Linux下Vim编辑器的使用

进入vim之后,是处于[命令模式] ,需要切换到[插入模式]才能够输入文字。[正常模式]切换至[插入模式]输入a输入i输入o[插入模式]切换至[正常模式]「ESC」健[正常模式]切换至[末行模式]「shift +;」, 其实就是输入「:」退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:w (保存当前文件)wq (输入「wq」,存盘并退出vim)q!(输入q!,不存盘强制退出vim)

2023-09-23 14:38:59 176

原创 STL : stack 容器基本操作

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

2023-08-15 15:37:25 81 1

原创 vector 模拟实现

vector是表示可变大小数组的序列容器就像数组一样,vector也采用连续的存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

2023-08-11 22:28:32 77

原创 string 模拟实现

string是官方提供的一个字符串操作类,相比于传统使用 char* 进行字符串操作,该类提供了相当多的字符串操作函数,使得该字符串类使用起来相当方便。string类底层已经将增、删、查、改以及扩容这些机制封装好了,我们只需要直接使用即可。

2023-08-11 21:16:57 52

原创 C++程序内存的分配

栈的效率比堆要高很多,因为栈是机器系统提供的数据结构,计算机在底层提供了栈的支持,分配专门的寄存器来存放栈的地址,压栈和出栈都有相应的指令,因此栈在分配的效率上是一定比堆上快的。在执行函数时, 函数内局部变量的存储单元可以在栈上创建,函数执行结束的时候,这些内存单元会自动被释放,栈内存分配运算内置于处理器的指令集,效率高,但是 分配的内存容量有限。堆的生长方向是向上的,也就是向着内存地址增加的方向,而栈刚好是相反的,栈是向着内存减小的方向生长的(因为栈的空间十分有限,所以栈是从上限往栈的下限生长的)

2023-08-10 20:12:15 587 4

原创 STL: string 容器基本操作

string是C++中一个重要的知识点,和其它容器使用比起来可以说是大同小异,接下来简单的string的一些接口的使用和讲解一些大概的底层实现是怎样的,如它的构造函数,拷贝构造,赋值重载以及对于容量的操作相关的接口等等。

2023-08-09 14:10:15 68 1

原创 static修饰符

静态成员变量使用前必须先初始化(在类外定义)。静态成员变量为所有类对象所共享,也受访问限定符(public、protected、private)的限制。静态成员函数不能调用非静态成员函数,非静态成员函数可以调用静态成员函数 静态成员函数没有隐藏的 this 指针。静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问。

2023-08-02 22:14:06 74 1

原创 运算符重载

日期类运算符重载

2023-08-02 21:09:30 32

原创 C++名字空间

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。// 命名空间中可以定义变量/函数/类型 int rand = 10;int val;int a;int b;int c;int d;} }命名空间中可以定义函数,自定义类型。命名空间可以嵌套。同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

2023-07-28 09:56:32 37 2

原创 类和对象详解

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。类是一种复杂的数据类型,它是将不同类型的数据和这些数据相关的操作封装在一起的集合体。类中的成员有数据成员和函数成员两种。数据成员是用来描述对象属性的静态成员。函数成员是用来描述对象属性的动态成员。

2023-07-27 09:09:35 64 1

原创 哈希表(uthash)详解

哈希表uthash的使用详解

2023-07-26 14:13:45 969 2

原创 详解int (*parr3[10])[5]

首先int *parr3指的是 声明了一个名为parr3 的 int 类型的指针变量,那么int *parr3[5] 便是包含5个int * 类型的 **指针数组,**那么搞懂了int (*parr3)[5] ,我们就可以来看看int (*parr3[10])[5],与前者不同的是,后者在parr3后多了 [ 10 ],既然。int (*parr3)[5] 中的 parr3,指向长度为5的一维数组,那么加个 [10]意思就是有10个这样的parr3指向长度为的一维数组。

2023-07-19 21:54:49 124

原创 常用排序算法之【插入,希尔,快排,选择,堆排,归并,计数】详解

常用的排序算法:直接插入排序,希尔排序,快速排序,简单选择排序,堆排序

2023-07-05 20:43:59 527 1

原创 链队列的基本操作

队列的链接存储结构称为链队列(linked queue),通常用单链表表示,其节点结构与单链表的节点结构相同,为了使空队列和非空队列的操作一致,链队列也加上头节点,根据队列的先进先出特性,为了操作上的方便,设置对头指针,指向链队列的头节点,对尾指针指向终点节点

2023-05-23 16:22:33 1427

原创 栈的基本操作

栈(Stack)是只允许在一端进行插入或删除操作的线性表。栈是限定仅在表的一端进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的站称为空栈。

2023-05-23 15:53:07 318

原创 双向循环链表的基本操作

双向链表的结点:指针域1+数据域+指针域2指针域1:指向该结点前面一个结点指针域2:指向该结点后面一个结点。

2023-05-13 00:06:39 274 1

原创 顺序表代码实现

顺序表的基本代码实现

2023-04-11 14:09:48 98 1

转载 预编译、编译、汇编、链接

预编译、编译、汇编、链接

2023-04-05 17:13:21 229 1

空空如也

空空如也

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

TA关注的人

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