自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux系统编程】shell命令以及运行原理 && Linux权限

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目录, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。一个文件一定是属于一个目录,一个文件属性能不能被查看,是由目录的权限决定的。

2024-07-16 21:11:24 544

原创 【Linux系统编程】基本指令(二)

(进行命令自动补齐,当你敲对应的指令不需要敲完全,按一下tab键,运气好就可能一下补全命令,那是因为你未敲完全的命令,还有可能其他的命令也是以你未敲完的命令开头。公历是现在国际通用的历法,又称格列历,通称阳历。敲入想查找的历史命令,输入查找命令的其中一个字符,会进行补全,不满足想要查找的,自己继续补全,直到查找成功,敲个回车键就会执行历史命令。-v :压缩的过程中显示文件!-a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。

2024-07-15 15:29:01 836

原创 【Linux系统编程】基本指令(一)

2.Linux创建记事本的命令叫做nano,没有的可以yum install -y nano进行安装,单独使用nano命令,会默认打开一个记事本,如果不做任何操作,进行退出后,该记事本不会被创建,若进行了其他操作,会创建一个记事本,按Ctrl+x退出,y进行保存,后面叫你输入一个文件名称,然后回车就可创建一个记事本。说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。

2024-07-15 15:28:17 670

原创 C++|智能指针

1.每个shared_ptr对象,其都包含着一个指针,该指针所指向空间内容用来计数有多少个指针指向该空间,即有多少个对象管理同一份资源,当多个对象管理同一份资源,那么他们的指针就会指向同一份空间,空间内容记录着这些数量,每增加一个对象管理相同资源,则计数也会加1。那么weak_ptr是怎样解决问题的了,其实很简单,weak_ptr不在对引用计数进行管理了,所以shared_ptr对象初始化时的引用计数都是为1,在进行析构的时候,引用计数都会减到0,然后释放对应的_ptr,_pcount。

2024-07-11 22:03:57 876

原创 Linux|背景 && 环境搭建

我们知道在1945年8月15日结束了战争,1946年诞生了第一台计算机埃尼阿克,早期的计算机主要用于美国人军工领域(导弹计算轨道,微波炉,网络等),但不久迎来了美苏冷战时期(1947-1991),而老美趁着这段时期大力发展,一度领先。可能大家未听说过Linux,或者只知道它是一个搭配在计算机上的操作系统,但对操作系统的概念却并不清楚,在学习操作系统之前得先了解它的一个大概发展史,在操作系统还没出来之前,计算机先是发明出来的,那我们可以计算机的诞生说起。回到首页,可以购买便宜的服务器,我买的就是这个38的。

2024-07-09 22:39:17 1110

原创 C++|异常

回到异常抛出匹配原则,对于用catch(...)捕获异常导致的问题是不知道异常内容,为了解决这一问题,实际当中,公司会自定义自己的一套异常体系,这个体系是一套继承的规范体系,那么大家抛出的都是派生类对象,并将派生类对象传给基类,捕获异常时就捕获父类就可以,然后通过父类的多态调用打印出异常内容,这种方法大大优化了异常的捕获。public:, _id(id){}protected://错误码对应的内容int _id;//错误码。

2024-07-09 22:39:02 726

原创 C++11|包装器

也是一个函数包装器(适配器),callabl代表可调用函数,arg_list用来接收绑定多个参数,以逗号分割,从而生成一个新的参数列表来替换原函数的参数列表,并将该bind函数对象赋值给newCallable,当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中的参数。在上述示例中,由于类型的复杂,useF函数模板需要实例化三份,从而使得代码变得相对冗余,面对这种问题,function包装器可以带来一定的优化。类型值的可调用对象)进行一次实例化。

2024-07-06 22:55:44 1002

原创 C++11|lambda语法与使用

为了解决不便,c++11中便引入了lambda表达式,lambda在书写方式带来了一定的优势,类似范围for带来的感受,其实其底层的实现依然是仿函数,在底层,编译器会根据lambda表达式生成一个类,类中有对应的仿函数实现,lambda接收到的参数都会传给仿函数,那么为了进一步弄清楚,先来了解语法,学会使用,再来探究底层。在C++中,lambda 表达式会被编译器转换成一个匿名的类类型,并生成一个特定的名称来标识这个 lambda 函数对象。④[&]:表示引用传递捕捉所有父作用域中的变量(包括this)

2024-07-05 10:35:45 784

原创 C++11|完美转化 && 新的类功能 && 可变参数模板

通过以上的实验,可以发现,emplace对比insert仅仅减少了一个移动构造,而移动构造的时间复杂度并不多高,所以emplace确实比insert好一点,但是并不是说好到哪里去,当然这是深拷贝的情况,但是对于浅拷贝就不一样了,当浅拷贝比较大时,对于insert来说时间复杂度较高,而对于emplace直接构造才会有更大的优势。参数包的意思是可以通过外面传递多个参数给这个参数包,当要获取里头的参数时,就可以通过展开参数包来获取,虽然这是获取参数的方式,但同时也是难点,对于展开参数包,这里有两种方式。

2024-07-05 10:30:01 932

原创 C++11|左、右值引用和移动语义

左值:是一个表示数据的表达式(变量名或解引用的指针等),但是它有一定的规则:左值是可以被取地址+左值可以出现在赋值符号的左边。定义时const修饰后的左值,不能给它赋值,但是可以取它的地址。注意:左值,并不代表它一定是在赋值符号的左边,它只是一个表示数据的表达式,通常出现在左边,要判断是不是左值,得判断是否可以取地址即可。左值引用:对左值进行引用,即对左值取别名int main()//一下a、b、p、c都是左值int a = 1;int b = 2;

2024-07-05 10:25:40 637

原创 C++11|列表初始化 && 声明

小故事:1998年是C++标准委员会成立的第一年,本来计划以后每5年实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初标准叫C++ 07。但是到06年的时候,官方觉得2007年坑定完不成C++ 07,而且官方觉得2008年可能也玩不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是其他年完成。结果2010年的时候也没完成,最后在11年终于完成了C++标准。所以最终定名为C++ 11。

2024-07-05 10:23:11 670

原创 C++|哈希应用->布隆过滤器

上一篇章学习了位图的使用,但它只适用于整数,对于要查询字符串是否在不在,位图并不能解决。所以针对这一问题,布隆过滤器可以派上用场,至于布隆过滤器是什么,其实并没有什么神奇的,就是在位图上套了哈希函数罢了,这两者组合起来就是布隆过滤器,而字符串就可以通过哈希函数转换成整数映射到位图当中去。

2024-07-05 10:06:56 1376

原创 C++|哈希应用->位图

位图,本质上也是一个数组,通过哈希思想构造的一种数据结构,他提现的哈希思想是整数与比特位的映射,通过比特位来代表某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在。通过一道经典题来引入如何模拟实现位图结构。方法1:遍历,时间复杂度O(N)方法2:排序O(N*logN)+二分查找O(logN),时间复杂度O((N+1)*logN)

2024-06-12 21:35:03 1017

原创 C++|哈希结构封装unordered_set和unordered_map

上一篇章,学习了unordered系列容器的使用,以及哈希结构,那么这一篇章将通过哈希结构来封装unordered系列容器,来进一步的学习他们的使用以及理解为何是如此使用。其实,哈希表的封装方式和红黑树的封装方式形式上是差不多的,如果有了红黑树的封装理解经验,我相信在理解哈希封装的过程会减少负担的。当然,在使用哈希结构中采用的是更具代表的哈希桶,接下来进行封装。

2024-06-11 23:13:49 900

原创 c++|unordered系列关联式容器(unordered_set、unordered_map介绍使用+哈希结构)

1.unordered_set与set一样元素key与value是一一对应的,且是唯一的,set中的key不能在容器中修改(元素总是const),但是可以插入和删除,且元素是去重的。2.unordered_set与set不一样的是,其底层是由数组实现,数组存储的是,且节点值的顺序没有按照特定的顺序排序,为了能在常数范围内找到可以所对应的key,unordered_set将相同哈希值的键值对放在相同的桶中(比较抽象,待后续分析)。

2024-06-09 16:00:11 854

原创 C++|set、map模拟实现<——红黑树

首先对于map而言,其存放的节点值是pair,而对于set存放的是key,这对于红黑树节点的实现到是没啥问题,但是对于红黑树内部的构造,是需要查询插入的位置,就需要进行比较,若将比较实现成key的比较,那么对于pair类型又该如何比较,虽然知道比较的也是pair中的key,但是如何做到既满足set中的key类型比较,又满足pair类型中的key比较,总不能干两份代码吧。1. 当右子树与根访问完,要符合大到小的遍历,得去左子树进行访问,同理左子树得满足大到小的遍历,首先就得找到左子树的最大节点,即最右节点。

2024-05-28 09:41:13 914

原创 C++|红黑树(分析+模拟实现插入)

用一个枚举来存放一个节点的颜色,该节点中,包括左指针、右指针、指向父亲的指针,前面章节也学习了map和set的用法,这里了,对于节点的实现就采用kv模型,节点的值就用pair来存放。enum Color//对于红黑节点,用枚举结构来表示RED,BLACK,_kv(kv){}//默认给红色才符合规则,若默认给黑色的话,则插入的每个节点都是黑色节点,//那么就不能保证每条路径的黑色节点相同,违反了第4条性质。而给红色,就可以根据规则调整。

2024-05-24 10:58:39 603

原创 C++|AVL树(模拟实现,测试)

节点中包括左指针,右指针,指向父节点的指针,平衡因子,要存储的数据值。//节点,_bf(0)T _bf;//平衡因子T _data;//要存储的值。

2024-05-20 19:57:12 797

原创 C++|树形关联式容器(set、map、multiset、multimap)介绍使用

我们之前学过的STL中的部分容器,比如:string、vector、list、deque等。这些都是序列式容器,他们都是线性序列的数据结构,里面存储的是元素本身。关联式容器:也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高pair有两个模板参数,pair类中有两个元素first,second,分别为T1,T2类型。其中T1被typedef成first_type,T2被typedef成second_type。

2024-05-15 09:24:58 815

原创 C++|二叉搜索树

可以简单的总结一下,整个左子树的值比根小,整个右子树的值比根大,且每一颗子树符合该规则例如: 二叉搜索树 非二叉搜索树,3的左子树大于根。

2024-05-10 20:21:10 971

原创 C++|多态(虚函数、抽象类、多态原理)

这里有一点注意的是,重写虽然也叫覆盖,但虚函数重写是语法层的概念,覆盖是原理层(虚基表)的概念,这里先打个预防针,在后面会讲解。OK,你以为虚函数就全部了解完了吗,你错了,纯虚函数才是法外狂徒。

2024-05-03 22:18:44 963

原创 C++|继承(菱形+虚拟)

该定义格式的形式如上图所示,但继承根据继承方式存在一定的限定。

2024-04-27 22:46:24 824

原创 C++|模板进阶(非类型模板参数+特化)

在模板初阶中,所学习的模板的参数是,但其实还有。类型形参:就是跟在typename或者class后面的类型。例如:template,T就是类型形参非类型形参:就是用作为模板的参数。例如:template,在这里常量,在编译时,编译器会将 a替换为具体的值,这个值在编译时就已经确定了,因此它在程序运行时是不可改变的,这符合常量的定义,因此 a 可以被视为一个常量。也是一个非类型形参。可以理解为这是一种规定。整形常量编译阶段确认结果。

2024-04-23 10:21:13 903

原创 C++|stack-queue-priority_queue(适配器+模拟实现+仿函数)

从概念上来说,容器适配器是一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口。应用到栈和队列上,就是通过某种类的接口实现出一个栈或队列这样的类接口,即通过容器的接口适配出了栈和队列。deque(双端队列):是一种双开口的“连续(物理逻辑上的连续,实际底层并不一定)”空间的数据结构,理解为双开口的队列,可以进行头插头删,尾插尾删,其时间复杂度为O(1)。deque并不是真正连续的空间,而是由一段一段连续的小空间拼接而成的,类似于一个动态的二维数组。

2024-04-20 21:28:25 1233

原创 vector迭代器失效&&list迭代器失效

在vector与list的模拟实现中,其中有一问题就是迭代器的失效问题,那么迭代器的失效问题具体是指什么,接下来一探究竟。

2024-04-16 09:41:35 914

原创 c++|list使用及深度剖析模拟实现

①list底层是带头双向循环链表,在任意位置可进行插入和删除的序列式容器。②list与其他序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。③与其他序列式容器相比,list的缺陷是不支持任意位置的随机访问,要访问某个元素,必须从已知位置迭代到访问位置,这段迭代则需要额外的线性时间开销,途中,还需要开辟额外空间,来保存每个节点的相关联信息。

2024-04-15 09:25:02 1187

原创 c++|vector使用及模拟实现

跟string一样他也是一个类模板,跟string不一样的是由于没被typedef过,定义对象时需要显示实例化,例如:vector v;方括号中传的是类型,表示v对象中的数据类型是int类型,vector v1;表示v1对象中的数据类型是string类型vector本质上可以理解为一个数组,数组是可变的,即可变大小的数组序列容器。它的空间是连续的它的底层是使用动态分配数组来存储元素分配的空间比实际需要的存储空间更大来适应可能的空间增长。

2024-04-03 19:35:41 745

原创 c++|string模拟实现

对string的各种接口进行一个简易版的模拟实现,在模拟实现完之后对string的底层实现有了进一步的理解,了解大佬的编程写法思路。也算是对string有了一个小总结。

2024-03-28 15:08:05 432

原创 c++|STL简介+string类的使用(常用接口)

1.string类其实就是一个模板类,typedef过来的,是basic_string模板类的一个实例,用的char来实例化basic_string模板类。2.管理字符序列的一个类3.string类有许多接口,这些接口都是用来操作操作字符串4.这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

2024-03-27 23:36:47 976

原创 C++|模板初阶

class 类模板名///类成员3.2类模板实例化类名例如:stack s;等public:stack()~stack()_size = 0;_a = tmp;_size++;i < _size;int _size;int main()//类模板的实例化,数据类型为ints.print();//类模板的实例化,数据类型为doubles1.print();

2024-03-23 15:01:59 742 1

原创 c++|内存管理

int main()//new/delete 和 malloc/free最大区别就是new/delete对自定义类型除了开空间之外还会调用构造函数和析构函数// 也就是不仅可以开空间还可以初始化//而malloc和free只能对自定义类型进行开空间和销毁空间,而不会调用构造函数进行初始化free(p1);delete p2;return 0;

2024-03-21 16:19:41 582

原创 c++|类和对象(下)

而现在B类中因为有一个自定义有参构造函数,而A类中没有默认构造函数,只有一个有参构造函数,那么编译就会报错,说找不到默认构造函数,因此在这里需要使用初始化列表初始化自定义类型成员,B类的自定义构造函数才会去调用A类中的有参构造函数。

2024-01-30 19:41:46 746

原创 c++|类与对象(中)

对于日常认知,空类好像没有作用,但其实他也有实际的意义,任何类在什么都不写时,编译器会自动生成6个默认成员函数默认成员函数:用户没有显示的去实现该函数,而是编译器会生成的成员函数称为默认成员函数。其实就是祖师爷给编译器设定好的默认成员函数,我们自己不去定义这些函数时,编译器会自动帮我们实现。

2023-11-29 10:10:43 981

原创 c++|类和对象(上)

回顾C语言实现栈时,需要有一个结构体存放定义的变量,而具体的实现需要额外定义函数完成压栈、出栈、销毁栈等。那么在c++中,结构体不仅可以定义变量,也可以定义函数了,同样我们用栈来举个例子//栈的初始化exit(-1);_size = 0;//压栈++_size;//取队头元素//栈的销毁_size = 0;//变量的定义int main()stack s;s.Init(5);s.Push(1);s.Push(2);s.Push(3);

2023-11-23 21:49:17 874

原创 c++|内联函数

2.inline只是给编译器提供一个展开建议,至于实不实现展开看编译器,一般来说:函数规模较小、不是递归、不是频繁调用的inline函数编译器会展开函数体,否则会忽略其特性。1.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,则在编译阶段函数体会替换函数调用,优点:少了调用开销,提高程序运行效率,缺点:可能使目标文件变大。1.在debug环境下,默认不会对编译器优化,所以要查看inline函数得先开启设置,不然的话,即使加了inline,还是看不到inline函数展开的过程。

2023-11-21 21:18:00 137

原创 c++|引用

我们写代码,相当于在上层的页面写代码,编译器进行编译时,是对上层的代码进行语法分析、语义分析、符号汇总等等,一定要区分语法概念和底层的区别,所以引用对于上层而言就是一个语法概念的存在。9.引用比指针使用起来相对更安全(引用定义时就与变量绑定,也不用操作地址,而指针定义时未初始化就是野指针,还可以通过修改地址来访问变量)引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,他和他引用的变量共用同一块内存空间。上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

2023-11-21 21:15:44 200

原创 c++|命名空间、缺省、重载、引用、内联

c++是在c的基础之上,容纳进去了面向对象的编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对c++学习有一定的帮助,本章节主要目标:1.补充C语言语法的不足,以及c++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。2.为后续类和对象学习打基础。为了解决上述冲突,可以使用命名空间来解决,这里就引入了新的关键字namespace,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员1.命名空间的正常定义。

2023-11-21 21:15:33 115

原创 C++|前言

在上回书已经学习了C语言,我们知道C语言是面向过程语言,C语言是结构化和模块化的语言,适合处理较小规模的语言,对于复杂、高度抽象、建模等问题,并不适合。这一系列问题带来了软件危机,为了解决问题,20世纪八十年代,计算机界提出了OOP(面向对象)思想,而对应于面向对象思想的语言由此而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入了扩充面向对象的概念,发明了新的语言C++,与C语言存在着渊源关系。它既可以进行C语言的过程化设计,又可以进行抽象化面向对象的程序设计。

2023-11-08 22:44:04 501 1

原创 数据结构|栈和队列以及实现

队列当然也可以用数组和链表的结构实现,使用链栈的结构实现要更优一些,因为链式结构在出队列的时候的效率要比数组高,链式结构只要用两个指针可以控制队头队尾,而数组结构在出队头数据的时候无法确定头,需要更多的变量来记录头,效率大大降低。队列:只允许一端进行插入数据操作,在另一端进行删除数据操作的特殊性线性表,队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端称为。两者实现的连续区别:数组栈在空间上是连续的,而链表栈在空间上是不连续的,在逻辑上是连续的。

2023-09-03 14:52:31 457 3

原创 通讯录--集合动态的文件版

简易的通讯录往往需要朴实的“烹饪”就能完成一道“美味的佳肴”。我们需要一个通讯录,能够存储联系人的信息,能够对联系人的信息进行增删查改,查询,按姓名排序。相比对之前的三子棋、扫雷,有了一定的了解,这里对通讯录的感受也变得更加简单易懂。

2023-07-29 12:14:12 173 1

空空如也

空空如也

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

TA关注的人

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