自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++进阶】可变模版参数

我们在之前Linux的学习中了解过命令行参数,可以让我们在命令行中传入多个参数,并且之前在学习printf,scanf等接口时,接触过可变模版参数:而今天学习的可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”。比如我们常常这样声明一个可变模版参数:template或者template。

2023-07-25 18:17:28 1064 2

原创 【C++进阶】右值引用和移动语义

右值引用和移动语义

2023-07-20 22:54:37 757 2

原创 【网络编程】网络编程套接字(三)TCP网络程序

TCP网络程序|服务器|客户端

2023-07-18 10:22:56 1919 2

原创 【C++进阶】C++11基础

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。

2023-07-16 19:34:51 442 2

原创 【C++进阶】bitset位图介绍以及模拟实现

先来看下边一道面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。对这些数进行排序,再通过二分算法,查找这个数是否存在插入到unordered_set中,使用find函数查找是否存在数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。

2023-07-10 00:31:37 626 1

原创 【C++进阶】使用一个哈希桶封装出unordered_map和uordered_set

由于要使用一个哈希桶封装出unordered_map和uordered_set,所以要对哈希桶的模版参数进行改造,由于unordered_map是kv模型,而uordered_set是k模型,所以必须在实现哈希桶的时候提供模版,在封装uordered_set和unordered_map时传入不同的模版参数。还要要修改的是,如果同时封装出,在获得key值时,unordered_map 和 unordered_set的key是不同的,所以必须传入不同仿函数来获得key值,为了后边在可以进行key比较。

2023-07-05 18:47:50 596 2

原创 【C++进阶】哈希表

unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构,例unordered_map和unordered_set相比map和set查找效率会高很多,因为哈希结钩在查找方面优势很大。

2023-07-04 19:19:36 632 1

原创 【网络编程】网络编程套接字(二)简单的UDP网络程序

客户端套接字的创建与服务端的创建类似,只是在创建套接字之后,不需要进行绑定端口号和IP地址,因为服务器是给为了给别人提供服务,所以必须让别人知道IP地址和端口号,而且不能轻易更改,但是客户端的端口号只要是唯一的就可以了,不需要进行绑定,如何客户端只是绑定唯一的一个端口号,那么当一个进程没有启动,那么这个端口也不能给别人使用,如果这个歌这个端口被别人使用了,此时这个进程也就不能启动了,所以不进行绑定,而是在进程启动时分配端口号,可以提高利用率。,在该表的某一位置写入该结构体的指针,就是创建了套接字。

2023-07-03 18:13:24 404 1

原创 【网络编程】网络编程套接字(一)

网络编程套接字

2023-07-02 23:57:09 970 1

原创 【C++进阶】用一颗红黑树泛型编程实现map和set

因为在删除查找时必须通过key值来查找和删除,对于set的k模型,也可以使用value值来查找,因为key值和value是相同的,而对于map来说,就必须传入key值来查找。修改之前的代码,在插入时map传入的是一个键值对,而set传入是一个值,所以在获得key值是不同的,所以我们可以通过仿函数来获得key值。如果该结点的右子树不为空,那么中序遍历的下一个结点就是右子树的最左节点。该结点的左子树不为空,所以中序遍历上一个结点就是左子树的最右节点。该结点的左子树为空,所以中序遍历的上一个结点就是最近的。

2023-06-28 13:01:13 269 9

原创 【网络编程】网络基础(一)

计算机网络基础

2023-06-26 16:14:58 653 2

原创 【C++进阶】红黑树实现

由于节点的颜色不是红色就是黑色,所以采用枚举类型来定义结点的颜色。在C++中,enum是一种枚举类型,用于定义一组命名的整型常量。枚举类型可以使代码更加具有可读性。可以使用enum关键字来定义枚举类型,如下所示:RED,GREEN,BLUE在上面的例子中,我们定义了一个名为Color的枚举类型,其中包含三种颜色:RED,GREEN和BLUE,它们的值分别为0,1和2。在枚举类型中,每个枚举值都可以用作整数,并且可以通过枚举名称来访问它们。

2023-06-21 15:03:44 606

原创 【C++进阶】带你手撕AVL树

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。

2023-06-15 18:34:43 640 4

原创 【Linux】信号量(基于环形队列的生产消费模型)

在基于阻塞队列实现生产者消费者模型时,我们发现,在进行生产和消费时,必须先加锁最后解锁,所以在进行生产和消费时,一定是互斥进行的,所有任务都是顺序进行对临界资源的访问,一个临界资源被当成整体来看待的。但是在有的情况下,一个临界资源可以分成多个资源来使用,此时每个线程可以同时访问被分成的某一个资源,然后可以去同时处理,所以就可以实现并发,只有当多个线程来访问同一份资源时,要通过互斥同步来实现。那我们怎么知道是否有一份资源呢?

2023-06-11 15:18:56 825 2

原创 【C++进阶】迭代实现二叉树前中后序遍历

今天学习了使用非递归来实现二叉树的前中后序遍历,相比递归实现有一定难度,但是多多理解也不难。

2023-05-30 16:39:00 199 1

原创 【Linux】线程详解之线程互斥与同步

我们前边提到了,线程可以访问同一份资源,可能会出现数据异常的问题,所以我们引入了互斥的概念,通过加锁来使同一时间只有一个线程访问临界资源,当加锁之后,可能又会因为某一线程的竞争力过强,一直处于加锁和销毁锁的状态,导致其他线程不能去访问临界资源而导致饥饿问题,所以我们就要引入线程同步的概念,当一个线程在销毁锁之后,不能立马去申请锁,而是要到队列的末尾排序,进入条件变量的等待队列,不会造成其他的线程长时间不能访问临界资源的情况。它允许一个线程等待另一个线程满足特定的条件,然后再继续执行。,所以就会挂起等待。

2023-05-28 15:27:08 2269 1

原创 【C++进阶】二叉搜索树

在子函数递归时,我们的参数是很有讲究的,此时参数要传引用,在传引用之后,在递归时,下一个递归函数中的root就是上一个递归函数中的root->_left的别名,所以直接修改是可以的,不需要使用循环版本的父结点来指向了。3.要删除的结点左右孩子结点都不为空,我们使用替换法,将要删除的结点和该结点左子树中最大的结点,或者右子树中最小的结点互换,然后再去删除。要实现搜索二叉树,就必须实现二叉树的结点类,在前边数据结构中,我们学习过,一个结点类中有该结点的值,左子树的指针,右子树的指针。

2023-05-23 20:54:22 901

原创 【C++进阶】多态详解(下)

单继承和多继承的虚函数表

2023-05-21 22:53:44 552

原创 【Linux】线程详解之线程控制

任何语言,要在Linux上使用多线程,底层必须封装pthread库,其实pthread库是在用户级别的,而库中对应着每个线程的相关属性以及他们的栈,用户级得到的id是在对应某一线程的动态库在虚拟地址空间中的地址,而内核中的TWP才是内核中该线程的id,这个id一定存储在该线程动态库的结构体中,他是线程的一个属性,而线程的动态库被加载到进程地址空间的共享区中。默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏。

2023-05-21 11:05:31 743

原创 【Linux】线程详解之线程概念

经过前边的学习,我们知道进程拥有一个PCB,在Linux中被称为task_struct,并且有一个进程地址空间,也有一个页表,通过页表指向物理内存,但是从今天开始,对进程的概念可能发生变化,这个我们后边来说,在Linux中,并没有真正的线程,而是使用进程的PCB来模拟线程,也就是说一个线程在创建时,只会去创建一个PCB,而这个PCB也指向主线程的虚拟地址空间,和其他线程一起共享内存的代码和数据。一个线程也被称为一个执行流,这是因为线程是被CPU调度的执行流,而一个进程就是分配系统资源的基本实体。

2023-05-20 17:58:05 1096 1

原创 【Linux】进程信号详解(三)

可重入函数 SIGCHID信号 volatile关键字

2023-05-20 14:22:28 540 1

原创 【C++进阶】多态详解(上)

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。要实现多态,必须满足以下的几个条件:1.子类函数对父类函数实现重写,也就是覆盖。2.必须通过父类的指针或者引用去调用虚函数。delete p2;return 0;

2023-05-18 20:32:08 709

原创 【C++进阶】继承详解

万物皆对象,对象是具体的世界事物,面向对象的三大特征封装,继承多态封装,封装说明一个类行为和属性与其他类的关系,低耦合,高内聚;继承是父类和子类的关系,多态说的是类与类的关系。前边我们对封装有了一个系统的认识,今天我们来学习继承的相关内容。继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是。

2023-05-16 12:47:25 918 3

原创 【刷题】栈与队列:滑动窗口的最大值

首先先来看题目描述:这是一道栈与队列相关的题,给定我们一个整型数组,有一个长度为k的滑动窗口,让我们计算每次窗口的最大值。我们的想法可以是得到一队列数据结构,让进入这个队列的第一个数据一定是最大的,而进入这个队列之后的数据在内部进行操作,每次移动数据一进一出,但是不影响我们的前提,就是第一个数据为队列的最大值,也就是滑动窗口的最大值。

2023-05-14 12:01:25 444 2

原创 【Linux】进程信号详解(二)

上篇文章讲解了进程信号的第一部分,主要讲解了信号概念与信号产生的主要内容,这篇文章来讲解信号发送以及信号处理的内容。今天讲解了信号的发送以及信号的处理,希望可以帮到大家。

2023-05-13 21:55:49 961 2

原创 【C++初阶】C++模版(进阶)

前边我们讲解了模版初阶的内容,对泛型编程,函数模版,类模板有了一定的认识,今天我们来学习模版的进阶操作。一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2023-05-12 18:07:24 1008 2

原创 【C++初阶】C++模版(初阶)

C++的模版也是相较于C语言更有优势的地方,正是有了模版,才让C++真正实现了泛型编程,并且为C++的STL标准库提供了先决条件。在定义类模板时,如果函数声明于定义分开编写,我们要记得带上模版参数列表,并且要加上类域表示符,并且不建议函数声明与定义分文件编写。// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// ...

2023-05-12 16:15:30 601 2

原创 【Linux】进程信号详解(一)信号概念&信号产生

我们的生活中有很多的信号,例如早上的闹钟,过马路时的红绿灯,还有考试考砸回家之后妈妈的脸色等等都是信号。例如早上起床时的闹钟,听到闹钟响了之后,我们就知道了我们接下来的动作,就是要起床去敲代码了,但是在听到闹钟之后,可能我们还有点困,把闹钟关掉了,但是闹钟已经响了这件事在我们的脑子里已经留下了印象,等过一会在一个合适的时间起床。但是这跟我们的进程信号有什么关系呢?

2023-05-12 00:06:56 519 4

原创 【C++初阶】类与对象(中)

我们可以像之前c语言一样,使用初始化init函数对一个对象进行初始化,但是这样必须实现一个成员函数,确实有点复杂,所以在C++中出现了构造函数,如果不实现也可以默认生成。当类中的属性需要在堆上申请时,如果使用默认的拷贝构造,会进行浅拷贝,直接将地址进行拷贝,所以两个对象指向同一个地址,直接在析构时会将申请的空间释放两次,会造成崩溃。如果实现了一个有参的构造函数,但是并没有实现无参的构造函数,不会生成默认构造函数,所以会报错。下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员调用的它的默认成员。

2023-05-07 15:59:48 411 3

原创 【C++初阶】类与对象(一)

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为C++的关键字,代表一个类,class后边加上这个类的名字,在类体内定义函数和变量,这点和C语言是不同的,并且不能省略括号外边的分号。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

2023-04-16 20:54:59 432 4

原创 【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)

优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。

2023-04-05 15:23:39 791 1

原创 【Linux】编辑器vim介绍

Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。VIM是自由软件。Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Emacs的不同变体。1999 年Emacs被选为Linuxworld文本编辑分类的优胜者,Vim屈居第二。但在2000年2月Vim赢得了Slashdot Beanie的最佳开放源代码文本编辑器大奖,又将Emacs推至二线, 总的来看, Vim和Emacs在文本编辑方面都是非常优秀的。

2023-04-05 14:07:44 858 3

原创 【Linux】权限详解

在多用户计算机系统的管理中,权限(privilege)是指某个特定的用户具有特定的系统资源使用权力,像是文件夹,特定系统指令的使用或存储量的限制。通常,系统管理员,或者在网络中的网络管理员,对某个特定资源的使用分配给用户不同的权限,系统软件则自动地强制执行这些权限。在现实生活中,权限业并不陌生,例如我可以将我的朋友圈设置为某些人可见,所以只有这些人才有进入我朋友圈的权限。我们要切记目录的权限,只有具有x执行权限才可以进入该目录读取文件,而只有r读权限只能看到文件名,而看不到文件的信息。

2023-03-26 11:48:32 1201 50

原创 【C++】一篇带你搞懂C++“引用”

在C语言的学习中,并没有引用这个概念,但是在C++中,加入了引用这个概念,说明引用也是很重要的,但是我们怎么理解引用呢?我是这么理解的,例如在水浒传中,108个英雄好汉都是自己的外号,例如及时雨宋江,豹子头林冲,花和尚鲁智深等等,我们就可以将引用理解为一个变量的外号,既然是外号,说明虽然名称不同,但是还是指的是同样的人。引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。int a = 10;int& b = a。

2023-03-21 14:36:37 678 29

原创 【Linux】学会这些基本指令来上手Linux吧

上篇文章介绍了一些常用的指令,这篇文章再来介绍一下Linux必须学会的指令。一.时间相关的指令ate显示date 指定格式显示时间: date +%Y:%m:%ddate 用法:date [OPTION]... [+FORMAT]1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下%H : 小时(00..23)%M : 分钟(00..59)%S : 秒(00..61)%X : 相当于 %H:%M:%S%d : 日 (01..31)

2023-03-21 12:36:58 1130 23

原创 【数据结构初阶】栈与队列笔试题

在我们学习了栈和队列之后,今天来通过几道练习题来巩固一下我们的知识。我们今天讲解了栈与队列的笔试题,希望可以得到大家的支持。

2023-03-20 21:39:32 734 33

原创 【Linux】基本指令介绍

从今天开始,我们一起来学习Linux的相关知识,今天先来介绍怎么登录Linux,并且介绍一些Linux的基本指令。使用 XShell 远程登录 Linux很多同学的 Linux 启动进入图形化的桌面. 这个东西大家以后就可以忘记了. 以后的工作中没有机会使用图形界面,因为Linux通过命令行就能完成系统管理,包括软件的安装和配置,用户群组的管理和权限设置,系统和服务的启停,文件管理和文件编辑等。. 通过浏览器和SFTP等客户端,还可以在客户端对Linux服务器进行可视化管理。

2023-03-18 14:14:08 3703 20

原创 【C++】入门知识之 函数重载

提到重载这个词,我们会想到什么呢?重载有一种一词多义的意思,中华文化博大精深,之前有一个笑话,中国的乒乓球谁都打不过,男足谁都打不过,哈哈哈这也是非常有意思的,但是今天我们要研究的是函数重载,看看重载和函数在一起会碰撞出什么火花呢?函数重载概念是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

2023-03-18 12:49:32 794 12

原创 【C++】入门知识之 缺省参数

缺省参数概念😃声明或定义函数时参数指定一个缺省值我们在定义函数时,在参数的位置赋值,就是为参数指定缺省值,我们传参时如果不传参数,默认就是使用缺省值。缺省参数分类😄。

2023-03-17 20:51:59 153 2

原创 【C++】入门知识之 命名空间与输入输出

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而。

2023-03-17 20:10:30 402 2

空空如也

空空如也

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

TA关注的人

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