自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL——Centos7下环境安装

判断修改密码时候新密码是否符合当前的策略,不满⾜报错,不让修改,关闭它 #安全强度,默认为中,即1,要求必须包含 数字、符号、⼤⼩写字⺟,⻓度⾄少为8位。2. 最好安装和⾃⼰系统⼀致的mysql版本,否则可能会存在软件兼容性问题,yum源中mysql后数字对应版本,本示例安装5.7版本mysql157。使用系统工具xargs将从标准输出读取内容按照行转换为参数argv,传递给yum,逐行卸载,需要加参数-y,yum卸载会询问,因此批量卸载会中断。

2023-11-06 20:08:08 497

原创 Linux——补充点(进程切换及页表映射)

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。该结构体存放在叫做任务列表的双向循环列表中!所学习过的包含:在进程地址空间中,栈区,代码区等一部分区域,是被整体所使用的!),因此堆是使用一个vm_area_struct小的结构体进行区分,使用双链表的形式进行管理!

2023-09-29 18:02:04 671

原创 Linux——进程信号

信号量和信号并无关联,是两个完全不同的性质!1. 掌握Linux信号的基本概念2. 掌握信号产生的一般方式3. 理解信号递达和阻塞的概念,原理。4. 掌握信号捕捉的一般方式。5. 重新了解可重入函数的概念。6. 了解竞态条件的情景和处理方式7. 了解SIGCHLD信号, 重新编写信号处理函数的一般处理机制每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到。

2023-09-17 11:58:10 412

原创 Linux——进程间通信(管道及共享内存)

进程想要通信,难度其实是比较大的先让不同进程看到同一份资源(内存空间)所以进程看到同一块“内存”,不能隶属于任何一个进程,更应该强调共享为什么要进行进程通信?交互数据,控制,通知等的目标进程间通信的必要性?单进程无法使用并发能力,更加无法实现多进程协同进程间通信是一种手段,目的是为了实现多进程协同管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”管道都是单向传输内容的,传输的都是“资源”(计算机通信领域设计的一种单项通信方式)

2023-09-13 17:14:29 363

原创 Linux——基础IO(2)及动静态库多种方式使用及制作

有关上篇文章 基础IO(1) 问题遗留解答及总结:1. 如下述代码,重定向后,使用C标准库函数写入后,使用系统调用接口close关闭文件后,运行后,其重定向文件内部没有数据!而在close之前使用C标准库提供的fflush函数后,文件内部便有了数据,作何解释?close(1);return 1;close(fd);return 0;

2023-08-26 18:28:05 424

原创 Linux——基础IO(1)

C默认会打开三个输入输出流,分别是stdin, stdout, stderr仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针打开文件的方式:w Truncate(缩短) file to zero length or create text file for writing. The stream is positioned at the beginning of the file.

2023-08-11 18:37:29 434

原创 Linux——进程控制

fork创建子进程,系统中多了一个进程,及包含进程对应的PCB结构体以及对应的地址空间及页表映射关系,并将代码和数据加载到内存中,并将该进程加载到运行队列,等待操作系统调度器的调度!阻塞等待和非阻塞等待,一般都是在内核中阻塞,等待被唤醒,如scanf和cin,底层必定封装了系统调用(阻塞等待),父进程通过调用waitpid来进行等待,如果子进程没有退出,waitpid这个系统调用,立马返回(非阻塞)然后shell读取新的一行输入,建立一个新的进程,在这个进程中运行程序 并等待这个进程结束。

2023-07-30 20:41:50 581

原创 C++进阶—C++11新特性(移动语义&&右值引用&&可变参数模板&&lambda表达式&&function包装器&&bind函数)

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

2023-07-17 11:45:40 1002

原创 C++进阶—哈希/unordered系列关联式容器/底层结构(一篇文章学习哈希)

一篇文章解决Hash,字典类型又被称为关联数组(associative array),关联数组和正常数组的使用方法是相似的,但其不同之处在于字典结构的下标不必是整数,而可以是任意类型。map和unordered_map这两种字典结构都是通过键值对(key-value)存储数据的,键(key)和值(value)的数据类型可以不同。但是字典中的key只能存在一个,即必须唯一(如果不唯一,则被称为multimap)。

2023-07-14 19:08:26 717

原创 C++进阶—红黑树详解及map、set封装(3)

/节点的值域//结点的颜色,_kv(kv){}情况一:uncle为空,或者uncle的颜色为黑色情况二:不断处理过程中,cur的parent为黑色,此树便处理完成,如下图情况三:cur走到根节点,此时cur为所有路径的根,且cur为红色,只需要将cur颜色变为黑色,此树便处理完成。

2023-07-07 08:16:02 151

原创 C++进阶—AVL树(2)

前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个 共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此 map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。

2023-07-04 10:10:30 96

原创 C++进阶—map、set及multimap、multiset(1)

set文档介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。

2023-07-03 12:14:45 141

原创 C++进阶—二叉搜索树Key、Key-Value模型应用及二叉树OJ(非递归实现遍历)

该种方式在现实生活中非常常见: 比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英 文单词与其对应的中文就构成一种键值对;再比如统计单词次数,统计成功后,给定单词就可快速找到其出现的次数,单词与其出 现次数就是就构成一种键值对。比如:给一个单词word,判断该单词是否拼写正确,具体方式如下: 以词库中所有单词集合中的每个单词作为key,构建一棵二叉搜索树 在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。

2023-06-27 16:40:20 282

原创 C++进阶—二叉搜索树

二叉树和堆二叉树链式结构的实现二叉树层序遍历map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构二叉搜索树的特性了解,有助于更好的理解map和set的特性二叉树中部分面试题稍微有点难度,在前面学习不容易接受,且时间长容易忘有些OJ题使用C语言方式实现比较麻烦,比如有些地方要返回动态开辟的二维数组,非常麻烦。因此最近有关二叉树搜索树的文章,是对二叉树部分进行收尾总结。

2023-06-25 13:52:37 252

原创 C++进阶—多态

需要声明的,以下代码及解释都是在vs2022下的x86程序中,涉及的指针都是4bytes。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题 等等多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。

2023-06-24 11:25:25 453

原创 C++进阶—继承(下)菱形(虚拟)继承分析&&虚拟继承存储对象模型

这篇文章主要接上篇文章,从更深层次理解普通继承切片切割以及虚拟继承切片切割,从底部虚拟内存分析,以及分析C++多继承带来的一些问题,和C++解决多继承带来问题采取的方式,并从底层内存观察其逐步实现及原理,最终更深层次感受多继承!并从软件工程分析继承和组合两个概念!!!很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱 形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设 计出菱形继承。否则在复杂度及性能上都有问题。

2023-06-22 23:23:10 851

原创 C++进阶—继承(上)简单特性

继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了/*Student和Teacher复用了Person的成员。

2023-06-21 20:40:20 337

原创 C++初阶—模板进阶

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

2023-06-21 11:04:10 775

原创 C++初阶—完善适配器(反向迭代器)

本篇文章主要根据前面所实现的STL中支持迭代器的容器进行完善,使用了适配器原则,传递正向迭代器数据类型,从而实现反向迭代器。

2023-06-20 09:25:53 270

原创 C++初阶—stack&&queue

stack文档stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下。

2023-06-20 08:10:38 273

原创 C++初阶—list深度解剖及模拟实现

list 容器,又称双向链表容器,即该容器的底层是以带头双向循环链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。list链表是序列容器,允许在序列内的任何位置进行常量时间的插入和删除操作,以及两个方向的迭代。本篇文章暂时不讲解拟制迭代器,将后续进行讲解!list单独提供了merge归并排序是通过与前面元素的链接和后面元素的链接的每个元素的关联在内部保持的。

2023-06-14 19:25:33 910

原创 Glibc——堆利用机制[拓展]

堆是每个程序被分配到的一块内存区域,和栈的区别主要在于堆内存是动态分配的。也就是说,程序可以从“heap“段请求一块内存,或者释放一块内存。是ELF文件当中的一个段。另外,堆内存是全局的,即在程序的任意位置都可以访问到堆,并不一定要在调用“malloc”的那个函数里访问。这是因为 C 语言使用指针指向动态分配的内存。但相比访问栈上的静态局部变量,使用指针也带来了一定的开销。

2023-06-08 11:14:22 625 1

原创 Linux——进程地址空间

当我们的程序,在编译的时候,形成可执行程序(可重定向二进制文件)的时候,没有被加载到内存时,我们程序内部,有地址吗?myprocSections:通过上述命令查看可知,虚拟存储地址可以看出:其实已经有地址了,程序需要链接动静态库,而使用动静态库函数就是用函数的地址进行调用,可执行程序其实在编译的时候,内部就已经有了地址!地址空间不要仅仅理解成为是OS内部要遵守的,其实编译器也要遵守!!!

2023-06-07 16:57:29 1321

原创 Linux——进程优先级&&环境变量

如果环境中不存在name,则将string添加到环境中,如果name确实存在,则环境中name的值将更改为value。通过 export testFor_11=你好, 设置环境变量,在通过系统调用getenv获取可得出设置其信息值,因此可得出以上结论。如图其中 argc 为 3,对应的argv分别是 "./argctest","-a","-b"getenv()函数在环境列表中搜索环境变量名,并返回一个指向相应值字符串的指针。3、字符串所指向的字符串成为环境的一部分,因此改变字符串也改变了环境。

2023-06-05 20:04:56 676

原创 数据结构—排序算法(归并&&非比较)

归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)空间复杂度:O(N)稳定性:稳定计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。时间复杂度:O(MAX(N,范围))空间复杂度:O(范围) 比特就业课稳定性:稳定。

2023-05-22 13:33:02 418

原创 数据结构—排序算法交换排序(冒泡&&快排)

1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN)3. 空间复杂度:O(logN)4. 稳定性:不稳定。

2023-05-21 13:56:45 622

原创 数据结构—排序算法(插入排序及选择排序)

1. 希尔排序是对直接插入排序的优化。2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些书本中给出的希尔排序的时间复杂度都不固定。

2023-05-20 15:56:02 472

原创 C语言小项目 -- 通讯录完整代码(登陆系统+动态开辟 + 文件操作)

📰0. 项目介绍使用C语言设计的一个,首先需要或者,进入通讯录管理界面,来实现联系人信息的长时间存储(包含姓名、性别、年龄、电话号码等),并且在需要时能够查找出相关联系人的信息。需要包含等功能。

2023-04-18 00:34:58 12117 1

原创 C++初阶—list介绍和使用

list文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。

2023-04-13 18:29:00 381

原创 C++初阶—vector深度剖析及模拟实现

vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对C++普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素。

2023-04-12 18:20:09 725

原创 C语言小项目 -- 扫雷游戏完整代码(递归展开 + 选择标记)

扫雷是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

2023-04-11 16:04:02 3783 2

原创 C++初阶—vector介绍和使用

vector文档介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。

2023-04-11 09:43:05 516

原创 C++初阶—string类(3)模拟实现

模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。

2023-04-10 09:36:28 483

原创 C++初阶—string类(2)

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)int main()// 不要使用cin>>line,因为会它遇到空格就结束了return 0;

2023-04-07 16:27:00 472

原创 C++初阶—string类(1)

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本 都使用string类,很少有人去使用C库中的字符串操作函数。string类中还有一些其他的操作,这里不一一列举,在需要用到时不明白了查文档即可。但由于使用习惯,很少使用。

2023-04-05 12:30:37 381

原创 C++初阶—STL简介

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意 运用、拷贝、修改、传播、商业使用这些代码,无需付费。由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低, 符号命名比较怪异。由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。简单总结一下:学习STL的三个境界:能用,明理,能扩展。

2023-04-04 18:09:48 493

原创 C++初阶——模板初阶

class 类模板名// 类内成员定义public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表。

2023-04-03 12:38:38 429

原创 C++初阶——内存管理

int main()//不会初始化,只是指向了一块空间return 0;free(p1);//释放空间//堆上申请空间//new 会自动调用构造函数,进行初始化delete p2;//释放空间会自动调用析构函数,清理对象中的资源//析构:后构造的先析构//结论:new/delete 是为自定义类型准备的//不仅会在堆上申请出来,还会自动调用构造函数初始化和析构函数清理。

2023-03-31 15:34:57 1087

原创 Linux——进程概念

它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。第一段进程一定有运行状态,而显示器属于外设,外设速度相比cpu很慢很慢,当进程向显示器打印的时候,此时进程进入阻塞队列,而阻塞队列完成后,再次回到运行队列,循环往复,只是进程在阻塞队列相比在运行队列待得时间更长。可知PCB所有进程的属性,Linux内核是由C语言编写的,因此对进程属性的描述,就可以使用结构体的描述,而对进程的管理,就变为了对进程PCB结构体链表的增删改查。

2023-03-30 18:17:28 682

原创 Linux——冯诺依曼体系结构/操作系统

在计算机中,操作系统是其最基本也是最为重要的基础性系统软件。从计算机用户的角度来说,计算机操作系统体现为其提供的各项服务;从程序员的角度来说,其主要是指用户登录的界面或者接口;如果从设计人员的角度来说,就是指各式各样模块和单元之间的联系。事实上,全新操作系统的设计和改良的关键工作就是对体系结构的设计,经过几十年以来的发展,计算机操作系统已经由一开始的简单控制循环体发展成为较为复杂的分布式操作系统,再加上计算机用户需求的愈发多样化,计算机操作系统已经成为既复杂而又庞大的计算机软件系统之一操作系统。

2023-03-29 16:31:30 339

空空如也

空空如也

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

TA关注的人

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