自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++11的空指针

是一个更安全、更清晰的空指针常量,应该优先使用它来替代传统的NULL宏定义。这可以防止一些可能误导的代码,例如将。的另一个好处是,它有一个专门的类型。总的来说,C++11的。错误地解释为整数0。

2024-04-26 23:40:11 99

原创 列表初始化

第一种 X a1{v};是C++11提出的,在所有场景中都能使用,强烈建议大家使用。窄化(收缩)转换是指数据由宽变窄或者出现数据丢失的情况。使用{}的初始化称为列表初始化。它还能防止窄化(收缩)转换。空初始化列表{}指定使用默认值进行初始化。初始化就是对象在创建时被赋值。

2024-04-26 23:36:59 141

原创 C++ new/delete

C++增加了new运算符分配堆内存,delete运算符释放堆内存。具体用法如下。

2024-04-24 23:12:39 358

原创 C++string类

下面介绍一些常见的string字符串操作。

2024-04-24 23:06:37 297

原创 C++内联函数

内联函数(inline function)的定义和调用和普通函数相同,但C++对它们的处理方式不一样。如果一个函数被定义为内联函数,在编译过程中,C++将用内联函数程序代码替换对它的调用。通过调试->反汇编可以观察在第9行,第10行,第11行都会调用square函数,在反汇编中call指令为函数调用。当调用一个函数时,程序就会跳转到该函数,函数执行完毕后,程序又返回到原来调用该函数的位置的下一句。函数的调用也需要花时间,C++中对于功能简单、规模小、使用频繁的函数,可以将其设置为内联函数。

2024-04-22 23:52:17 223

原创 Linux--线程

8.还有一种不太好的办法,就是不要退出进程了,退出线程.使用pthread_exit函数;

2024-04-22 00:00:00 1541

原创 C++函数重载

函数重载的关键是函数的参数列表--也称为函数的特征标。(1)重载函数必须具有不同的参数个数或不同的参数类型,若只是以返回值的类型不同或形参名不同是不能重载。参数x与两个原型都匹配,因此编译器不知该调用哪个函数,故不能重载,类型引用和类型本身视为同一个参数。函数重载(函数多态),让您能够使用多个同名的函数,"多态"指的是有多种形式,通常使用函数重载。const左值引用可与可修改的左值匹配,const左值匹配(最匹配),右值匹配;左值引用,const左值引用和右值引用同时用于函数的参数列表,该如何匹配呢?

2024-04-21 23:58:00 238

原创 C++默认参数

C++中允许函数提供默认参数,也就是允许在函数的声明或定义时给一个或多个参数指定默认值。在调用具有默认参数的函数时,如果没有提供实际参数,C++将自动把默认参数作为相应参数的值。实参按从左到右的顺序依次赋值给形参,不能跳过。1.如果上面有函数声明,下面写函数定义。则只能在声明时写默认参数,定义时不能写(防止不一致)。2.如果上面没有函数声明,只有函数定义,则函数定义时写默认参数。总之默认参数只能写一次。3.参数必须从右往左添加默认值。3.参数必须从右往左添加默认值。如何设置默认参数呢?

2024-04-21 23:54:58 257

原创 C++ 引用

指针和引用区别:2.引用更接近const指针,一旦与某个变量关联起来,就将一直效忠于它,不能再作为别的变量的引用。

2024-04-20 22:56:53 709

原创 C++引用和指针的区别

在C++中,引用和指针都是用于间接访问变量或对象的工具,但它们之间存在一些重要的区别。

2024-04-20 22:55:36 373

原创 第一个C++程序

第一个C++程序第一行程序:包含标准的输入/输出头文件iostream。第二行程序:使用标准命名空间std。第六行程序:向标准输出设备(屏幕)输出信息,cout是用于输出信息的流对象。endl表示换行,类似C中的'\n'。

2024-04-19 23:32:18 323

原创 C++的发展和特点

除了标准模板库,C++还有非常多的第三方库,如Boost库、图形库QT、图像处理库OpenCV、机器学习库Tensorflow、线性代数库Eigen、游戏库OpenGL等,这些优秀的库为企业的项目开发提供了非常大的支持。这一阶段C++基本上是传统类型上的面向对象语言,并且依靠接近C语言的效率,在计算机语言中占据着相当大的比重。相比于C语言,C++的编译系统能检查出更多的语法错误,代码安全性更高。这一阶段由于STL库和后来的Boost库等程序库的出现,泛型编程设计在C++中的比重越来越大。

2024-04-19 23:25:41 426

原创 面向对象程序设计概述

面向对象程序设计方法(Object Oriented Programming,OOP),它将数据及对数据操作的方法(函数)放在一起,形成一个相互依存、不可分离的整体——对象,从同类对象中抽象出共性,形成类。一个对象既可以是个简单的对象,也可以是由多个对象构成的复杂对象。例如,张伟、王晓、陈悦,他们是不同的学生,但他们有共同的特征,都有姓名、班级,学号等属性,具有选课、听课、做作业等行为。类和对象的关系是抽象和具体的关系,类是对象进行综合抽象的结果,一个对象是类的一个实例。(1)有一个名字以区别于其他对象;

2024-04-18 23:20:32 333

原创 进程间通信--消息队列

msgget()创建或者获取一个消息队列msgget()成功返回消息队列 ID,失败返回-1。

2024-04-18 23:05:58 186

原创 C++STL库中vector的内存分配方式

在C++ STL(Standard Template Library)中,是一个动态数组,它可以根据需要增长或缩小。关于。

2024-04-17 22:50:15 246

原创 C++ Const的作用

const可以用于定义常量,这些常量的值在初始化后就不能再改变。

2024-04-17 22:45:35 354

原创 进程间通信--共享内存

2024-04-16 23:59:15 315

原创 进程间通信--信号量

信号量就是控制某个进程能够对某个资源进行访问;保证同一时刻只能由一个进程对某个资源进程访问;信号量是一个特殊的变量,对信号量的操作都是一个原子操作;打印机信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目, 获取资源时,需要对信号量的值进行原子减一,该操作被称为 P 操作。当信号量值为 0时,代表没有资源可用, P 操作会阻塞。释放资源时,需要对信号量的值进行原子加一,该操作被称为 V操作。信号量主要用来同步进程。信号量的值如果只取 0,1, 将其称为二值信号量。

2024-04-16 23:58:26 199

原创 进程间通信--管道

(7)有名管道和无名管道的区别:有名管道可以在任意进程间使用,无名管道主要在父子进程间通信.读端关闭的描述符,写端写入时产生,该信号会终止程序(向无读进程的管道写数据))如果管道是空的,读操作会阻塞;如果管道是满的,写操作会阻塞;(1)管道必须读,写进程同时open,否则会阻塞;(1)管道必须读,写进程同时open,否则会阻塞;(2)如果管道没有数据,那么read会阻塞;(2)如果管道没有数据,那么read会阻塞;管道一个是读打开,一个是写打开.管道的分类:有名管道和无名管道。2.打开管道:open();

2024-04-15 22:11:35 338

原创 mybash---打造自己的命令解释器

字符串分割函数注意:strtok线程不安全,原因就是函数实现使用了一个static的变量(指针记录下次分割的地址,再次调用要沿用上次的,所以需要静态变量).在多线程中,如果两个线程都使用了strtok的话,这个变量的值就会被另一个线程不定期的进行修改.

2024-04-15 22:06:10 2051

原创 KMP算法

由next[j]=k,得到P0...Pk-1=Pj-k...Pj-1 (1)对比书上的结果,会发现其实是一样的,只是书上next数组第一个值为0;又变成一个模式匹配的问题,那么k=next[k];例子:"abcabcdabcdabcdeabc"已知:next[1]=0,next[0]=-1;"ababcabcdabcde" 主串。6."abaabcac"(书上的例子)"abcdabdabcdabc"主串。得到next[j+1]=k+1;不妨假设next[j]=k;"abcdabc"子串。

2024-04-14 23:07:04 864

原创 串及BF算法

1.字符串的拷贝,比较,链接等等(C语言)2 串:用' '引起来的字符序列,例如'abcd' (区别字符串"abcd")3.空串:'' (区别字符串"")4.子串:包含空串和本身,'abc'的子串:'','a','b','c','ab','bc','abc'7个5.真子串:包含空串,不包含本身,'abc'的子串:'','a','b','c','ab','bc',6个6.串的长度:串中字符的数目,例如'abc'的长度为3;7.空格串:由一个或者多个空格组成的串' '

2024-04-14 23:00:43 335

原创 数据结构--链式队列

1.带头节点,队头为第一个数据节点,队尾在最后一个数据节点2.头节点为一个队头指针,一个队尾指针,增加队尾指针可以让入队的时间复杂度为O(1)

2024-04-13 22:39:43 331

原创 数据结构--循环队列

和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素.在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front).1)队列:先进先出的一种线性结构,入队(插入)的一端称为队尾,出队(删除)的一端称为队头2)队列的存储方式有两种,一种为顺序结构(顺序队列),两一种为链式结构(链式队列)

2024-04-13 22:36:41 610

原创 数据结构--链式栈

链栈栈顶:栈顶在表头(即第一个数据节点)(时间复杂度是O(1))

2024-04-12 17:03:04 300

原创 数据结构--顺序栈

1.栈的特点:后进先出,后来的反而需要先服务(访问受限的线性表)2.栈又分为顺序栈和链式栈 3.上面顺序栈是不定长的顺序栈,能自动扩容4.栈只能在一端进行插入和删除,插入和删除的这一端称之为栈顶,另一端称之为栈底;5.顺序栈的栈顶在尾部,因为入栈和出栈的时间复杂度为O(1)

2024-04-12 17:00:50 246

原创 数据结构--静态链表

1.静态链表,利用顺序表模拟链表2.静态链表包含两条链表,一条为有效数据链表,另一条为空闲节点链表3.有效数据链表为带头结点的循环链表,且头节点在0号下标4.空闲数据链表为带头结点的循环链表,且头节点在1号下标5.静态链表的优点:和顺序表对比,插入删除不需要移动数据,O(1)6.静态链表的优点:和链表对比,不需要频繁的创建和删除节点7.静态链表的缺点:和顺序表对比,需要增加一个next 8.静态链表可以动态增长,满后扩容,将扩容的内存添加到空闲链表;

2024-04-11 23:09:37 344

原创 数据结构--双向链表

双向链表其实和单链表一样,就是把两条方向的单链表都处理好就行.双向链表的考点就是多级指针,一定要注意判断;

2024-04-11 23:06:38 327

原创 数据结构--循环链表

循环链表其实和单链表是一样的操作,只是在处理的时候处理好尾节点即可,切记,遍历循环链表中不可出现NULL,若遍历的时候出现NULL就错了.

2024-04-10 21:21:47 385

原创 数据结构--单链表

int data;//数据域//后继指针头插,头删 时间复杂度是O(1)尾插,尾删 时间复杂度是O(n)

2024-04-10 21:18:48 359

原创 不定长顺序表

顺序表的特点:1.插入数据的时间复杂度是O(n),如果是尾插时间复杂度是O(1);2.删除数据的时间复杂度是O(n),如果是尾删时间复杂度是O(1);3.通过下标访问数据时间复杂度是O(1);顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素;存储密度大(高),每个结点只存储数据元素(对比链表);随机访问:顺序表是一种支持随机存取的存储结构,根据起始地址加上元素的序号,可以在O(1)时间内找到指定的元素,这就是随机存取的概念;

2024-04-09 21:42:18 250

原创 进程创建示例

当前主程序main通过fork复制产生一个子进程,子进程用新程序"newmain"替换自身;(newmain:打印参数内容和环境变量)我们发现执行不到这一句,因为去执行ps去了,然后从ps退出进程了,除非execl执行失败.exec系列单独是能使用的,但是没有多大意义.通常我们会结合fork一起使用;

2024-04-09 21:38:07 223

原创 进程替换的应用

写一个程序main.c,运行起来之后替换执行test程序(test打印参数内容)

2024-04-08 22:36:19 68

原创 进程替换exec系列介绍

/pathname:新替换的程序的路径+名字//arg :传给新程序主函数的第一个参数,一般为程序的名字//arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数//系统调用//前五个是库函数,最后一个是系统调用,所以本质上上面5个都是通过第六个系统调用实现的也就是说,上面5个都是调用的execve,不过都是把参数放进数组,然后把数组传递给这个系统调用execve;也就是说,这些方法没有本质区别;也就是说,本质上只有一个替换方法,就是execve;

2024-04-08 22:34:47 2183

原创 数据结构--线性表

存在唯一的一个被称为“第一个”的数据元素;存在唯一的一个被称为“最后一个”的数据元素;除第一个之外,集合中的每一个数据元素都只有一个前驱;除最后一个之外,集合中的每一个数据元素都只有一个后继;线性表是最简单最常用的一种线性表。线性表分为顺序表和链表。顺序表又分为定长顺序表和不定长顺序表。

2024-04-07 22:10:22 222

原创 数据结构-基本概念

数据,是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

2024-04-07 22:06:41 241

原创 linux--进程创建

替换,这里就体现了写时拷贝的意义,如果全部都要替换,那么最开始的复制是没有意义的;注意,用了写时拷贝就只复制了几个页表的映射,内容还没有复制,然后执行了替换exec.实际上Linux上这个bash就是不断的复制自身,然后把复制出来的用exec替换成想要执行的程序(比如ps);运行ps,发现ps是bash的一个子进程;原因就是bash把自己复制一份,然后替换成ps;执行了3次ps -f ,ps -f的父进程的ID(PPID)都是一样的,即bash.在Linux新的进程的产生过程(

2024-04-06 16:14:27 263

原创 SIGCHLD信号

(2).父进程调用wait()方法获取子进程的退出码 父进程获取子进程的退出码之后,操作系统就将这个子进程的PCB删除了,就不会产生僵死进程了. 两个方法的本质是一样的,但是方法二会阻塞,就是父进程在。由执行结果可以看出,子进程结束,确实是会给父进程发送17号信号SIGCHLD;那么在这里,我们修改一下代码,让父进程收到子进程的代码,打印一下收到的信号代号,不要忽略掉;而且我们也可以简单写,就是不获取退出码,我们只要不变成僵死进程就可以;(1).父进程先结束(孤儿进程会被收养)子进程结束,才会获取退出码.

2024-04-06 16:12:02 245

原创 信号的应用举例之自己实现kill命令

运行sleep 500这个进程,发现使用自己的mykill命令发送15号信号显示的是"已终止(Terminated)",发现使用自己的mykill命令发送9号信号是"已杀死(killed)",那有人又说kill命令没有传递信号代号,其实是一样的,也就是mykill传递两个参数即可,把信号代号也就是argv[2]定义成15,或者9即可.自己实现kill命令,需要PID,需要信号代号.就是我们也要写一个类似kill -9 PID 的命令;9号信号是一个特殊的信号,它是不允许改变响应方式的.

2024-04-05 21:00:16 433

原创 linux--信号

信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作;与信号有关的系统调用在<signal.h>头文件中.用signal修改SIGINT信号的响应方式示例如下int main()while(1)sleep(1);exit(0);那如何结束该进程呢?方法一:打开另外一个终端,通过ps -ef|grep main这个命令找到该进程的pid,然后kill掉它.方法二:当然,我们也可以ctrl+,这个是终端退出的信号;

2024-04-05 20:56:50 567

空空如也

空空如也

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

TA关注的人

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