自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 模板的使用

本文介绍了C++泛型编程中的模板技术。主要包括函数模板和类模板的实现与使用,解释了模板隐式/显式实例化的区别,以及模板参数的匹配原则。同时阐述了模板特化的概念,包括函数模板特化和类模板特化的实现方式,其中类模板特化又分为全特化和偏特化。最后总结了模板编程的优缺点:优点在于提高代码复用率和开发效率,缺点则包括代码膨胀、编译时间增长以及错误信息不易定位。模板是泛型编程的基础,能有效实现与类型无关的通用代码。

2025-11-11 11:06:45 522

原创 Linux进程控制

本文主要介绍了Linux进程管理的几个核心概念:进程创建(fork)、终止、等待和程序替换。fork函数通过复制父进程创建子进程,父子进程共享代码段但数据段采用写时拷贝机制。进程终止分为正常退出(exit/_exit)和异常终止,exit会刷新缓冲区而_exit直接终止。进程等待(wait/waitpid)用于回收子进程资源并获取退出状态,避免僵尸进程。程序替换(exec系列函数)可以在不创建新进程的情况下加载新程序,替换当前进程的代码和数据。文中详细说明了各系统调用的用法、参数和注意事项,并通过代码示例演

2025-11-07 10:17:27 860

原创 C/C++内存管理

本文介绍了C/C++中内存分布及动态内存管理方法。内存分为代码段、数据段、BSS段、堆和栈,各自存储不同类型数据并具有不同的管理特性。文章重点对比了malloc/calloc/realloc三种动态内存分配函数的区别,以及C++中new/delete操作符的使用方式。其中malloc不初始化内存,calloc会初始化为0,realloc用于调整已分配内存大小;new/delete则支持构造函数调用和异常处理。文章最后强调不要混用malloc/free和new/delete,并指出在C++中应优先使用new/

2025-10-18 09:34:06 666

原创 进程优先级、环境变量、进程地址空间

本文摘要: Linux进程管理主要包括优先级调度和环境变量管理两部分。优先级通过PRI和NI值控制,范围限定在60-99,默认80,避免进程饥饿。可通过top命令调整nice值(-20到19)来修改优先级。环境变量如PATH、HOME等具有全局性,可通过export、env等命令管理。进程地址空间采用虚拟地址映射物理内存,保证进程独立性和内存安全。通过页表机制实现同一虚拟地址映射不同物理内存,使父子进程变量地址相同但值不同。这种设计实现了内存有序管理、访问控制和进程隔离。

2025-10-16 21:53:48 643

原创 进程的基本认识

本文介绍了Linux进程的基本概念和核心机制。主要内容包括:1.进程是运行中的程序,由可执行程序和内核数据结构PCB组成;2.PCB(task_struct)包含进程标识符、状态、优先级等关键信息;3.进程创建通过fork系统调用实现,父子进程共享代码但数据独立;4.进程状态包括运行(R)、睡眠(S)、僵尸(Z)等,状态变化本质是PCB中变量的修改;5.僵尸进程是已终止但未被父进程读取的进程,会占用系统资源;6.孤儿进程会被init进程接管。文章还介绍了查看进程信息的方法和进程状态转换的原理。

2025-10-14 22:23:36 798

原创 OJ在线答题-测试报告

本文介绍了在线评测系统(OJ)的测试方案,包括功能验证、用户体验和兼容性测试。测试覆盖了首页访问、题目列表、详情页展示及代码自动评判等核心功能,采用手动测试和基于Selenium的自动化测试相结合的方式。自动化测试通过截图比对验证界面元素,并提供了测试代码示例。系统采用C++/Python等技术栈,支持多浏览器和多用户并发访问,确保平台的稳定性和可靠性。测试结果显示系统功能正常,界面布局合理,兼容主流浏览器和操作系统。

2025-10-09 11:00:25 1075

原创 博客系统-测试报告

本项目开发了一个简洁高效的个人博客系统,包含登录、写博客、编辑/删除博客和注销四大核心功能。系统采用前后端分离架构,通过Selenium实现自动化测试,覆盖登录页、博客列表页、编辑页和详情页四个主要场景。测试结果显示系统功能完整可靠,错误率为0。该系统解决了第三方平台广告多、风格受限的问题,为用户提供了纯净的知识管理空间,支持博客的完整生命周期管理(创建、编辑、删除),并采用屏幕截图+时间戳的方式记录测试过程,确保测试结果可追溯。性能测试使用JMeter验证了系统的高可靠性。

2025-10-09 10:59:36 706

原创 类与对象(下)

C++类设计中,初始化列表用于高效初始化成员变量,尤其适用于const、引用和自定义类型成员。静态成员由所有类对象共享,需在类外定义。友元机制允许外部函数或类访问私有成员,分为友元函数和友元类。内部类是定义在另一个类内部的独立类,可访问外部类的静态成员。这些特性共同构成了C++类设计的核心机制,包括通过初始化列表优化对象构造过程、使用静态成员实现数据共享、借助友元突破封装限制,以及利用内部类实现逻辑分组。

2025-09-30 22:22:59 1025

原创 常见排序(直接插入、希尔、选择、堆、冒泡、快排、归并、计数)

本文总结了常见排序算法的基本概念和特性。排序是将记录按关键字大小排列的操作,分为稳定和不稳定排序,以及内部和外部排序。详细介绍了直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序和计数排序等算法的思想、实现代码及特性分析。其中,直接插入排序、冒泡排序、归并排序和计数排序是稳定的;希尔排序、选择排序、堆排序和快速排序是不稳定的。时间复杂度从O(N^2)到O(NlogN)不等,空间复杂度最低为O(1)。计数排序适用于范围集中的整型数据,归并排序需要额外空间,快速排序综合性能较好。

2025-09-22 20:59:50 831

原创 理解二叉树

本文系统介绍了树和二叉树的定义、结构特性、存储方式及基本操作。首先阐述了树的基本概念,包括节点度、层次关系、父/子节点等术语。重点讲解了二叉树的定义、性质(如节点数公式n0=n2+1)及两种存储结构(顺序存储适合完全二叉树,链式存储使用二叉/三叉链)。详细介绍了堆的数据结构及其实现方法,包括向上/向下调整算法、建堆、堆排序等核心操作。最后给出了二叉树链式结构的实现代码,包括节点创建、三种遍历方式、节点计数、高度计算等基本功能。全文通过C语言代码示例,完整呈现了树形数据结构的关键知识点和编程实现。

2025-09-19 12:21:30 812

原创 理解栈和队列

摘要:本文介绍了栈和队列两种数据结构的基本概念与实现方法。栈遵循后进先出原则,通过数组实现,包含初始化、销毁、入栈、出栈等操作;队列遵循先进先出原则,采用链表实现,支持初始化、销毁、入队、出队等功能。两种结构各有优缺点:栈操作简单高效但访问受限,队列适合顺序处理但无法随机访问。文中详细展示了两种数据结构的C语言实现代码,包括核心函数定义和操作流程。

2025-09-16 22:43:04 272

原创 链表(无头单向不循环和带头双向循环链表)

摘要: 链表是一种非连续存储结构,分为无头单链表和带头双向循环链表两种主要类型。无头单链表通过指针连接节点,实现逻辑连续但物理不连续的存储,需手动处理头尾操作。带头双向循环链表引入哨兵节点简化操作,所有操作时间复杂度为O(1)。两种链表各有特点:前者结构简单但操作复杂,适用于笔试场景;后者结构复杂但实现简单,适合实际数据存储。文中详细展示了两种链表的C语言实现,包括初始化、增删查改等核心操作,并重点分析了二级指针在链表操作中的必要性。

2025-09-13 16:23:17 294

原创 理解顺序表

摘要:本文介绍了线性表中的顺序表实现,包括静态和动态两种形式。重点阐述了动态顺序表的结构设计(数组指针、容量和大小字段)及其核心操作实现:初始化、销毁、增删查改等。通过三个文件(声明、定义、测试)的模块化编程,展示了尾插/删、头插/删、任意位置插入/删除等操作的代码实现。同时分析了顺序表的局限性:扩容时的性能消耗和空间浪费问题,指出当容量从50扩到100但只插入5个数据时会造成45个单位的空间浪费。

2025-09-10 21:13:44 131

原创 类与对象(中)

本文介绍了C++空类中编译器自动生成的六个默认成员函数:1)构造函数用于对象初始化;2)析构函数负责资源清理;3)拷贝构造函数实现对象复制;4)赋值运算符重载支持对象赋值;5)const成员函数确保不修改对象状态;6)取地址操作符重载提供对象地址访问。重点分析了构造函数的重载形式、析构函数的调用时机、拷贝构造函数的引用参数特性、赋值运算符的连续赋值支持,以及const成员函数对this指针的修饰作用。这些默认成员函数构成了C++类的基础功能框架,编译器会在未显式定义时自动生成默认实现。

2025-09-10 20:57:18 831

原创 Linux权限

超级用户:可以在linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情,名字自己定义超级用户的命令提示符是“#”,普通用户的命令提示符是“$用户的转换指令:root->普通用户 (普通用户->root(s所属组特殊情况:一个组内可以只有一个人,一个组内也可以有很多人,用组长的名字对应组的命名-:普通文件l:软链接(类似Windows的快捷方式)b:块设备文件(例如硬盘、光驱等)p:管道文件c:字符设备文件(例如屏幕等串口设备)s:套接口文件。

2025-08-08 21:17:14 659

原创 C++基础知识

摘要:本文介绍了C++编程的重要知识点,包括:1)63个关键字的使用注意事项;2)命名空间的定义和使用方法,包括嵌套和多文件合并;3)输入输出流(cin/cout)的用法;4)缺省参数的全缺省和半缺省实现规则;5)函数重载的实现方式;6)引用及其与指针的区别;7)内联函数的作用和使用限制;8)auto关键字和范围for循环;9)nullptr作为指针空值的优势。这些内容涵盖了C++基础语法的重要特性,对理解C++编程思想具有关键作用。

2025-06-08 16:12:30 1639

原创 this指针

c++通过引用this指针来解决,就是c++编译器给每个非静态成员函数增加一个隐藏的函数指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),函数体中所有成员变量的操作,都是通过该指针去访问。看到上述代码有这样一个问题,Date中的Init和Print两个成员函数,函数体没有关于区分不同对象,那d1调用Init函数时,该函数是如何设置d1对象,而不是设置d2对象呢?this指针本质是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。下面我们先看一段代码。

2023-09-20 15:23:43 90 1

原创 类与对象(上)

/类体:由成员函数和成员变量构成//注意分号class为关键字,classname为定义类的名字,{}为主体类体中的内容称为类的成员:类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数声明和定义同时放在类体中,如果成员函数放在类体中,编译器会把它被当做内联函数来处理public:public:int _name;int _sex;int _age;//People.h,声明放在类的.h文件中public:public:int _name;int _sex;

2023-09-15 12:03:02 104 1

原创 引用的基本运用

引用不是新定义一个变量,而是给已定义的变量换一个名称,编译器不会单独给引用开辟一块空间,因为它和引用的变量是同一块内存空间。需要注意的是:函数返回时,出了函数作用域,返回对象还在(还没给系统),则可使用引用返回,返回系统了,必须使用传值返回。引用在底层实现上是有空间的,因为引用是按照指针方式实现的。传引用返回(出了函数作用域,对象还有)但做返回值时常会伴随一些问题。那这里结果为什么是7呢?传值传参(任何时候都可以)引用在定义时必须初始化。4.3传值、传引用返回。”,还是指的同一个人。需要注意的是权限可以。

2023-09-13 13:19:28 96

原创 指针的深入

答案是也表示首元素地址,二维数组的起始是一维数组的数组,二维数组的首元素是二维数组第一行,首元素的地址是第一行的地址,也是一个一维数组的地址。这里p2先于*结合构成一个指针变量,指向的是一个大小为10的整型数组,所以p2是一个指针,指向一个数组,叫数组指针。数组的地址+1,跳过整个数组的大小,所以&arr+1相对于&arr的差值是40。注意的是这里[ ]的优先级高于*号的,所以要加上()保证p先于*结合。实际上&arr取出的是整个数组的地址,而不是数组首元素的地址。

2023-05-29 21:43:26 112 1

原创 双链表增删查改

两个一比较,就很容易发现双向结构更复杂,在实际当中往往双向运用的更多,所以不要看它复杂,用起来反而更轻松,不说多话,咱们接着往下看。那这个是怎么实现的,想肯定是想不出来的,那咱们就用图来表示,这里phead表示哨兵位,看作没有,看成进行中转的作用。声明之后我们还要具体运用,也就是定义,咱们要一步一步走,不然吃成大胖子,还怎么往后走,先看。链表又分为单向和双向,带头和不带头,循环和不循环,那下面我们要着重带头双向循环链表。test3:查找某数和在pos位置插入。的储存结构,逻辑上是连续的,通过。

2023-05-15 18:31:26 86 1

原创 指针的基本运用

char*类型的指针存放的就是char类型变量的地址,所以不难发现int*就是存放int类型变量的地址,其余就等同。指针就是在内存当中占一个字节地址,就相当于在内存中单位为一个字节的编元,对应的有相应的地址,简而言之就是。这里通过&将a的地址存放到p变量中,显然这里p是指针变量,那它究竟是哪种类型了,咱们往下走。通过取地址操作符&,将内存当中的地址取出来,存放在变量当中,这个变量就是指针变量。4/8个字节,指针就是地址,地址的存放需要多大空间,指针变量的大小就是多少。二级指针就是存放一级指针变量的地址。

2023-05-06 17:47:08 151

原创 预定义与宏

在#define机制中包含一条规定,允许吧参数替换到文本中,这种实现称为宏或定义宏宏的申明方式这里要注意左括号必须与name紧挨在一起如果两者之有空白存在,参数列表会解释成为stuff的一部分eg:我们传一个参数swap(5)这里就变成了5*5那如果是这种状态了int a=5;按我们预想结果来看这里应该打印36,实际看下图那这是为什么呢?这是因为变成了printf(“%d”,a+1*a+1)那应该如何解决这个问题了,只需要在定义宏哪里x加上括号就行了(x)*(x)

2023-04-05 22:38:26 148 1

原创 文件的基本知识

文件的说明和使用、文件的打开和关闭、文本文件和二进制文件、文件读取结束的判定介绍了文件的相关知识信息,对文件有了一定的了解。如果在阅读过程中,发现错误,请及时联系我予以纠正。

2023-04-04 23:28:13 991 1

原创 结构体的声明、自引用、定义和初始化、内存对齐、传参

第二点,int a 4 8 4 char b 1 8 1 int c 4 8 4 比较,取较小值。特别说明嵌套的话就看最大对齐数,然后依次往下数,就比如我上面举例的这个从4的整数倍往下数12个。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,会导致性能下降。第一点,这里int是四个字节,所以从0开始,一直到3,这是a所占的,b c一样。第三点,然后要从整数倍开始,4是1的倍数,所以b就从这里。12为最大对齐数的整数倍,所以符合(最大对齐数为4)别急,咱们一步步看下去。

2023-03-19 14:51:16 209

空空如也

空空如也

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

TA关注的人

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