自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux调试器-gdb使用

gdb 与 cgdb 的下载。

2024-10-25 00:43:30 1005 1

原创 Linux项目自动化构建工具-make/Makefile

makefile定义的变量没有类型。演示:$():的意思是直接替换括号中变量的内容。

2024-10-20 20:11:43 998 1

原创 Linux编译器-gcc/g++使用

1. 预处理(进行宏替换)2. 编译(生成汇编)3. 汇编(生成机器可识别代码)4. 连接(生成可执行文件或库文件)格式 gcc [选项] 要编译的文件 [选项] [目标文件]如果我们直接:gcc [要编译的文件]则会在当前目录下生成一个a.out 可执行文件。 我们也可以自定义可执行程序的名称。 开始进行程序的翻译,预处理做完就停下来 。预处理完之后还是C语言代码(干净的C语言代码)开始进行程序的翻译,编译完成就停下来。 开始进行程序的翻译,汇编完成,就停下。XXX.o可重定义目标文件,

2024-10-19 00:10:39 1083 1

原创 数据结构:图(Graph)

在无向图中,若从顶点v1到顶点v2有路径(经过其他点到也算有路径),则称顶点v1与顶点v2是连通的。如果图中任意一对顶点都是连通的,则称此图为连通图。

2024-10-17 00:02:56 1215

原创 了解使用并查集

比如:某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不同的学校,起先互不相识,每个学生都是一个独立的小团体,现给这些学生进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};编号为4和9的同学属于1号小分队,该小分队有3人(包含队长1),编号为3和5的同学属于2号小分队,该小分队有3个人(包含队长1)。西安学生小分队s1={0,6,7,8},成都学生小分队s2={1,4,9},武汉学生小分队s3={2,3,5}就相互认识了,10个人形成了三个小团体。

2024-10-08 21:14:08 501 1

原创 Linux编辑器-vim使用

我们一共有12种总模式,分别是六种基础模式和六种附加模式:我们可以在底行模式输入:「help vim-modes」:即可查看vim的十二种模式。(不同的vim支持的模式可能会更多)。

2024-09-30 22:35:16 1095 1

原创 Linux 软件包管理器 yum

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.

2024-09-27 19:33:21 337 1

原创 Linux权限的概念

但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限.:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。所以对于普通用户,自身要受到对应权限的约束,即使这个文件是自己的!一个卑鄙的用户fy 看到改不了的你的文件,于是把你的文件删除了。虽然取消了其他用户的删除权限,但也同时取消了他们新建文件的权限。取消share的w权限吗,原本的x权限变成了t .,别的用户是删除不了的。

2024-09-27 18:32:19 919 1

原创 C++中的IO流

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?1. 使用itoa()函数2. 使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。

2024-09-24 23:45:29 774 1

原创 特殊类的设计与类型转换

内置类型是可以隐式转换为自定义类型但需要借助成员函数。int _a2;int main()//单参数A aa1 = 1;//多参数不想隐式类型转换可以加个explicit 关键字这种写法是错误的因为 operator ()被仿函数占用了, 所以C++就有一种特殊的写法。

2024-09-17 22:21:07 1159 1

原创 布隆过滤器

一些场景下面,有大量数据需要判断是否存在,而这些数据不是整形,那么位图就不能使用了:我们可以用hash 函数先将它转成整形值,再去映射对应的一个位。但是如果有一个字符串C与A映射的是同一个位, 就会造成误判,C明明不在却被标志成了1.所以我们可以得出布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。

2024-09-10 22:57:29 1124 2

原创 C++位图的实现与详解

在讲解位图之前我们先来看一道很经典的面试题。给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。我们有以下两种种解决方法:1. 遍历,时间复杂度O(N)。(太慢)2. 排序(O(NlogN)),利用二分查找: logN。深入分析:解题思路2是否可行,我们先算算40亿个数据大概需要多少内存。

2024-09-09 23:37:48 904 1

原创 unordered系列容器的实现

我们知道STL中的与底层就是一个开散列的哈希表。

2024-09-01 18:21:59 660 1

原创 C++哈希表

首先我们来了解一下unordered系列关联式容器。

2024-08-29 20:04:21 1011

原创 C++智能指针

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

2024-08-27 22:27:11 976

原创 C++异常的详细介绍

传统的错误处理机制:1. 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。2. 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。

2024-08-25 21:54:14 918

原创 C++11的更新介绍

在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法如果待排序元素为自定义类型,需要用户定义排序时的比较规则随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。因此,在C++11语法中出现了Lambda表达式。有没有什么其他的方法呢?

2024-08-22 23:19:36 821

原创 C++11的更新介绍

就是说如果传的是左值他就是左值引用,如果传的是右值它就是右值引用。用 typeid 是查看不了的,它只会打出你本来的类型那么能不能通过函数调用来查看?查看不了如果希望能够在传递过程中保持它的左值或者右值的属性, 就需要用到完美转发。std::forward 完美转发在传参的过程中保留对象原生类型属性。

2024-08-16 21:39:20 1060

原创 C++11的更新介绍

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2024-08-12 23:30:47 1032

原创 set 和 map: set 和 map 的实现

关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的 键值对,在数据检索时比序列式容器效率更高。

2024-07-31 17:56:59 874

原创 红黑树:红黑树的实现

_kv(key){}为什么初始化节点为红色呢?因为如果初始化黑色节点则必定破坏性质4.导致每个路径黑色节点数量不一样,而插入红色则有可能不会破坏性质3.所以插入为红色节点。

2024-07-30 23:04:26 842

原创 AVL树:AVL树的实现

pair是将2个数据组合成一组数据,如stl中的map就是将key和value放在一起来保存,或者当一个函数需要返回2个数据的时候,也可以选择pair。pair的实现是一个结构体,主要的两个成员变量first和second,分别存储两个数据, 因为是使用struct不是class,所以可以直接使用pair的成员变量。//_pf记录高度差(右子树高度减去左子树高度)int _pf;

2024-07-30 22:07:43 772

原创 二叉树进阶:二叉搜索树

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:树的雏形: 1.2 二叉搜索树操作int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};1. 二叉搜索树的查找a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。b、最多查找高度次,走到到空,还没找到,这个值不存在。 2. 二叉搜索树的插入插入的具体过程如下:a. 树为空,则直接新增节点,赋值给root指针b. 树不空,按二叉搜索树性质查找插入位置,插入新节点1. 二叉

2024-07-17 22:26:43 682 1

原创 多态:多态的定义及实现,抽象类,多态的原理

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。虚函数:即被virtual修饰的类成员函数称为虚函数public:virtual void BuyTicket() { cout

2024-07-10 00:35:56 2125

原创 继承:基类和派生类对象赋值转换,继承中的作用域,派生类的默认成员函数,继承与友元,继承与静态成员,复杂的菱形继承及菱形虚拟继承

下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类可以称派生类为子类,基类为父类。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。//这里体现出了Student和Teacher复用了Person的成员。// 学号protected:int _jobid;// 工号int main()Student s;

2024-07-08 00:59:58 1001

原创 模板进阶:非类型模板参数,类模板特化,模板的编译分离

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

2024-07-07 00:31:11 1206

原创 stack 和 queue

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用。

2024-06-03 23:45:37 703

原创 list 的实现

list实际上是一个带头双向循环链表,要实现list,则首先需要实现一个结点类,而一个结点需要存储的信息为:数据、前驱指针、后继指针而对于该结点类的成员函数来说,我们只需实现一个构造函数即可,因为该结点类只需要根据数据来构造一个结点即可,而结点的释放则由list的析构函数来完成,

2024-05-29 23:53:42 852

原创 vector 的实现

vector 是表示大小可以变化的数组的序列容器。就像数组一样,vector 对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的元素一样高效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。在内部,vector 使用动态分配的数组来存储其元素。当插入新元素时,可能需要重新分配此数组才能增大大小,这意味着分配一个新数组并将所有元素移动到该数组。

2024-05-22 23:38:18 746

原创 C++string 类的常用方法

iterator 是定义在类域里面的我们可以通过迭代器来修改指向的内容。

2024-05-12 22:59:54 3833

原创 模板初阶()

比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

2024-04-26 23:26:04 1076

原创 C/C++内存管理

new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。若没有默认构造函数则会报错大括号中为什么能传数字呢?隐式类型转换然后再进行拷贝构造由于编译器优化的原因直接调用构造class Apublic:: _a(a): _a(a)A(A& a)_a = a._a;~A()

2024-04-21 22:40:18 780 1

原创 类与对象(下)

static修饰的成员函数不能给缺省值,缺省值是给初始化列表的,他在静态区不存在对象中,不走初始化列表。所以要将operator

2024-04-18 22:20:39 717

原创 类与对象(中)

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数。注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存。这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需。返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。因为this 指针的原因我们需要像下面这样输出,可这样是不符合逻辑的。隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

2024-04-15 23:14:08 787

原创 类的六个默认成员函数(上)

对于日期(Date)类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

2024-04-12 23:17:29 714

原创 字符输入输出函数

用法与printf("%c" , c[ i ]);手动输入 abc‘\n’ 以下是运行结果。结束后会自动在末尾加上 \0。自动读取流中数据进行输入。自动输出到'\0'结束。

2024-04-11 23:05:27 350 1

原创 字符串函数

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。"qwe" 存在程序内存的常量区中,是编译时就固定下来的(不可更改),然后c是一个指向常量区"qwe" 的指针,c本身存在栈区。• 如果源字符串的长度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。需要注意的是函数的返回值为(无符号整型)size_t。会将源字符串中的 '\0' 拷⻉到⽬标空间。• 拷⻉num个字符从源字符串到⽬标空间。

2024-04-10 22:30:50 936 1

原创 通过键盘输人任意一些字符,统计字母、数字、空格及其他字符的个数(除数字、空格和字母以外的字符均属于其他字符,当通过键盘输人“$”时结束。

调用 getchar()函数,将从键盘输人的数据暂存到键盘缓冲区,直到输入结束(遇到'$'字符)后,将缓冲区中的数据一起输人到计算机中。利用while循环对每个字符进行判断和统计,直到遇到'$'字符为止。不过上面代码我们需要注意的是 循环后面括号里的条件表达式我们需要给 c = getchar() 加上括号否则 getchar() 中的字符不会输入到变量 c 中运行结果如下:这两段代码效果一样:由于并没有赋值给 C所以C中储存的内容是随机的。

2024-04-08 19:29:04 263

原创 类和对象(上)

在C++ 中更喜欢用 class 来定义类//成员函数void Init(int n = 4)//不需要传参类里面直接能访问return;top = 0;//成员变量int* arr;size_t top;stack st2;st2.Init();return 0;不过这样写是会报错的,报错如下:这是因为C++引入了访问限定符。

2024-04-06 20:36:30 879 1

原创 C++入门(2)

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。是一直没有人去使用它,C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的。

2024-04-01 21:52:29 643

空空如也

空空如也

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

TA关注的人

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