- 博客(114)
- 收藏
- 关注
原创 C++11
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符号的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。
2025-03-20 18:38:14
23
原创 VMWare的下载安装以及Linux镜像的安装配置
本博客涉及VMWare的下载安装,Ubuntu、Centos、OpenEuler的镜像的下载以及安装配置和xshell的下载安装配置并且连接Linux虚拟机、以及在Linux环境下怎么下载安装开发工具,怎么写代码,怎么配置调试工具,希望可以帮助到大家。由于Centos停更了,所有这里我们就使用Ubuntu,其实两者差距不是很大,命令都是差不多一样的,只是有的配置文件存放的地方不一样,所以这里不必纠结,Ubuntu的群体大多数都是学生,而且Ubuntu的图形化界面做的也很好,最适合新手学习。
2025-03-13 15:06:48
34
原创 MySQL环境搭建
将MySQL Server依次展开会看到一个是x64,另一个是x86,x64是64位,x86是32位,然后选中,点击箭头移动到右边,然后点击下一步。
2025-03-10 00:12:32
730
原创 进程间通信
进程间通信(Inter-Process Communication,IPC)是指运行在同一台计算机或不同计算机上的多个进程间进程数据交换和通信的技术。由于每个地址都有自己的地址空间,它们无法直接访问彼此的数据,因此需要通过特定的机制来实现通信。IPC是操作系统和多进程编程中的一个重要概念,广泛应用于分布式系统,多任务操作系统以及各种应用程序之间。
2025-03-05 22:56:52
81
原创 库制作与原理
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。静态库.a[Linux]、.lib[windows]动态库.so[Linux]、.dll[windows]// ubuntu 动静态库// C//C++// Centos 动静态库// C// C++静态链接的出现,提高了程序的模块化水平。
2025-02-15 23:26:04
104
原创 Ext系列文件系统
code-hard和code.c的inode值居然是一样的,硬链接,本质不是一个独立的文件,因为它没有独立的inode,硬链接本质是一组新的文件名和目标inode number的映射关系。2就是多了一个新的文件名指向目标文件,这个2叫做硬链接数。(在inode属性中存在引用计数)对文件进行备份!!!dir有两个文件名指向这个目标文件,一个是dir,另一个是dir目录下的"."那么我再在dir里面创建一个文件夹,那么它就会变成3。因为hello中有个..指向该目标文件。“.”和".."是硬链接。
2025-02-14 01:18:02
37
原创 基础IO
pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1缓冲区是内存空间的一部分。
2025-02-11 21:45:49
65
原创 进程控制
一个进程进入僵尸,代码和数据以及页表可以释放,但是PCB不能释放,所以退出码以及信号都放在了PSB中,然后父进程去调用系统接口,然后将值设置进父进程传的地址中,这样父进程就有可以拿到子进程的退出信息了。一个是库函数,一个是系统调用,上下层的关系,exit函数是语言上的,而exit要想终止程序必须调用_exit这种系统接口,只有调用操作系统提供的接口,它才能终止进程。当然,我们可以让子进程死循环,那么父进程就一直等待,然后杀掉子进程,父进程获取到的信号就为9,此时退出码无意义。(查看进程的退出码)
2025-02-09 03:45:51
66
原创 进程概念
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!现在我们就可以理解为什么有NI值了?比如我的程序在运行的时候我修改优先级,那么到底该放在活跃进程还是过期进程,只能等程序跑完往过期进程中放的时候根据nice值的修改放。
2025-02-07 15:48:24
83
原创 自动化构建-make/Makefile
我们前面说了,clean被.PHONY修饰了,那么这个clean就是伪目标,那么什么是伪目标呢?从我们执行结果可以看到,make只能执行一次,而make clean总是被执行,第一次编译main.c形成了main,第二次还想编译的时候其实没必要再编了,因为main.c没有被修改,也就是说这个可执行程序所依赖的源文件没有任何修改,就没有重新编的必要了,再重新编不就浪费时间吗,如果我今天的项目中存在1000个.c,我全部编译了需要花一个小时,一个小时刚编完,不小心又执行了一次make,难道再编一个小时吗?
2025-02-03 02:08:23
62
原创 用哈希表封装myunordered_map和myunordered_set
SGI-STL30版本源代码中没有unordered map和unordered set,SGl-STL30版本是C++11之前的STL版本,这两个容器是C++11之后才更新的。unorder_map要支持[]主要需要修改insert返回值支持,修改HashTable中的insert返回值为pair<Iterator,bool> Insert(const T& data)。
2025-01-31 02:31:21
64
原创 哈希表实现
当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加一个仿函数,这个仿函数支持把key转换成一个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就用默认参数即可,如果这个Key不能转换为整形,我们就需要自己实现一个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。从译名来看,有散乱排列的意思。{19,30,5,36,13,20,21,12,24,96}等这一组值映射到M=11的表中。
2025-01-30 15:26:29
166
原创 unordered_map和unordered_set的使用
unordered_set的声明如下,Key就是unordered set底层关键字的类型。unordered set默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将Key转成整形的仿函数传给第二个模板参数。unordered set默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持将Key比较相等的仿函数传给第三个模板参数。unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。
2025-01-28 01:12:23
88
原创 封装红黑树实现mymap和myset
map要支持[]主要需要修改insert返回值支持,修改RBtree中的insert返回值为pair<Iterator,bool> Insert(const T& data)。SGI-STL30版本源代码,map和set的源代码再map/set/stl_map.h/stl_set.h/stl_tree.h等几个头文件中。map和set的实现结构框架核心部分。
2025-01-27 00:53:02
266
原创 红黑树实现
如果p是g的左,c是p的右,那么先以p为旋转点进行左单旋,再以g为旋转点进行右单旋,再把c变黑,g变红即可。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c一定是新增节点,u存在且为黑,则c一定不是新增节点c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c一定是新增节点,u存在且为黑,则c一定不是新增,c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。
2025-01-25 22:48:09
212
原创 AVL树实现
通过图7和图8可以看到,左边高时m,如果插入位置不是在a子树,而是插入在b子树,b子树高度从h变成h+1,引发旋转,右边单旋无法解决问题,右单旋后,我们的树依旧不平衡。右单旋解决的纯粹的左边高,但是插入在b子树中,10为根的子树不再是单纯的左边高,对于10是左边高,但对于5是右边高,需要用两次旋转才能解决,以5为旋转点进行一个左单旋,以10为旋转点进行一个右单旋,这棵树就平衡了。我们实现的AVL树是否合格,我们不应该去检查平衡因子,平衡因子是随着值的插入而改变的,那如果平衡因子也是错误的呢?
2025-01-22 00:22:16
183
原创 异常
程序这样写还是不对的,因为srrsy2也有可能抛异常,array1如果抛异常的话就不需要释放什么资源,直接到外面去了,array2如果抛异常的话要释放array1,Divide如果抛异常要释放array1和array2,array2抛异常,再去捕获吗?有时catch到一个异常对象后,需要对错误进行分类,其中的某种异常错误需要进行特殊的处理,其他错误则重新抛出异常给外层调用链处理。就可以把捕获的对象直接抛出。这里的话我没就会用到智能指针,智能指针就是可以很好的解决这块的问题,抛异常就会自动释放内存。
2025-01-02 20:20:37
210
原创 Linux环境基础开发工具使用
这样的代码确实可以现实的倒计时程序,但是如果我将cnt的初始值9改成10的话,该程序就会出问题,当我在向显示器上打印1234的时候显示器上的是字符1,字符2,字符3,字符4,其实显示器只认字符,所以显示器才叫做字符设备,只不过显示器把字符1234写在了一起,看起来是1234,实则是1234这四个字符,所以c语言中的%d格式化是把整数转字符。vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。
2024-11-28 23:28:32
575
原创 Git的安装和使用
第一次上传需要填写用户名和密码,如果密码填错,需要在凭证管理器中删除,如果第二次再次上传的话还弹出这个框的话就不用去凭证管理器中删除,不弹的话就得去凭证管理器中删除。注意:这个软件是依赖前一个软件的,在安装的过程中需要选择第一个软件的路径,这里我就不做更改了,默认就行。右击鼠标,选择Git Clone,然后讲自己复制的仓库链接粘贴进去,然后点击ok。首先文件夹中要放我们要上传的文件或者文件夹,我这里就放了一个C语言的代码。点进仓库里面,我们发现里面的文件和我们云端上的文件是一样的。
2024-11-25 23:36:18
1872
原创 map和set的使用
set的声明如下,T就是set底层关键字的类型set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模板参数。set底层存储数据的内存是从空间配置器中申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模板参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历时走的搜索树的中序,所以是有序的。全面部分我们学习了vector/list等容器的使用,STL容器接口设计,高度相似。
2024-11-21 23:25:05
248
原创 IAR下载安装与新建工程
注册使用百度网盘即可享受免费存储空间。为自己要写代码的文件起个名字,以.c结尾,因为写的是C语言,如果看不到.c可以在文件夹中打开文件扩展名。将激活工具中的License中的码赋值到License#中,注意Name和Comparty一定要是英文。右击此电脑查看属性,注意,不是此电脑的快捷方式,也可以进入此电脑右击空白处查看属性。首先找到自己刚刚创建的文件夹,我的是在桌面上,然后为工程起一个名字,点击保存。在里面找到CC2530F256,选上,然后点击打开。0错误,0警告,这个时候就说明我们的工程没有问题。
2024-11-11 02:40:16
547
原创 多态
多态是一个继承关系的下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。
2024-11-07 16:13:05
206
1
原创 继承
下面我们看到Person是基类,也称作父类。Student是派生类,也称作子类。(因为翻译的原因,所以既叫基类/派生类,也叫父类/子类))。public、protected、private这三个关键字既可以在类里面修饰我们的成员变量和成员函数,也可以进行继承。
2024-11-03 22:31:15
258
原创 常见指令以及权限理解
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这 个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)。而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限。所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2024-11-02 01:37:34
220
原创 模板进阶
一个程序(项目)由若干哥源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。优先模板复用零代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性缺陷模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误t=O83Akw=array。
2024-10-26 19:31:38
405
原创 stack和queue
kw=stackkw=queue优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素优先队列中位于顶部的元素。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从特定容器的"尾部"弹出,其称为优先队列的顶部。
2024-10-26 19:16:12
353
原创 list
目录1. list的介绍及使用1.1 list的介绍1.2 list的使用(带头双向循环链表) 1.2.1 list尾插及迭代器遍历链表1.2.2 emplace_front1.2.3 erase 1.2.4 swap 1.2.5 splice1.2.6 sort 2. list源码 3. list的模拟实现 3.1 注意点3.1.1 list中的迭代器 3.1.2 const迭代器3.1.3 迭代器的构造 3.1.4 swap接口 3.1.5 size 3.2 知识点3.2.1 oper
2024-10-18 19:13:34
452
原创 双指针_算法
常见的双指针有两种形式,一种是对撞指针,一种是左右指针。一般用于顺序结构中,也称左右指针。left == right (两个指针指向同一个位置)left > right(两个指针错开)又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上的移动。这种方法对于处理环形链表或数组非常有用。其实不单单是环形链表或者数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使用快慢指针的思想。
2024-10-14 14:49:53
852
1
原创 string类
字符串最后一个单词的长度_牛客题霸_牛客网计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以。题目来自【牛客题霸】string s1;/*cin默认不会获取空格,它会认为空格和换行是分隔符,所以这道题得用getline。getline和gets的区别就是gets是C的,getline是C++的,gets应该和scanf对比。*/getline可以自定义结束标志,默认的结束标志是换行。//getline可以自定义结束标志, 默认的结束标志是换行。
2024-10-03 19:40:00
208
原创 Linux环境搭建
据权威部门统计,目前Linux在服务器领域已经占据75%的市场份额,同时,Linux在服务器市场的迅速崛起,已经引起全球IT产业的高度关注,并以强劲的势头成为服务器操作系统领域中的中坚力量。据Linux基金会的研究,86%的企业已经使用Linux操作系统进行云计算、大数据平台的构建,目前,Linux已开始取代Unix成为最受青睐的云计算、大数据平台操作系统。就是创建4,5个用户,一人一个即可。学习Linux系统编程,我们首先得知道Linux从哪里来的,它是怎么发展的,要说Linux,还得从UNIX说起。
2024-09-29 15:07:12
329
原创 STL简介
STL(standard template libaray - 标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包含数据结构和算法的软件框架。
2024-09-21 21:17:44
255
原创 模板初阶
/类模板的定义格式class 类模板名// 类内成员定义//C++11更喜欢用using替代typedefpublic:_size = 0;private:这样写的话总感觉不用类模板也是可以的,想用哪个类型就using中替换即可,但是并不是这样的。假设我要创建两个栈,一个栈存int类型的数据,另一个栈存double类型的数据,但是这个using或者typedef只能定义一个,解决不了问题。
2024-09-21 17:16:18
453
原创 操作系统迁移(CentOs -> Ubuntu)
channel_utm_content=进入官网&channel_utm_medium=sem&channel_link_type=web&channel_utm_source=百度&sat_cf=2&channel_utm_campaign=品专&channel_utm_term=主按钮1&_channel_track_key=see7zmAJ&link_version=1&wl_src=baidu。将刚刚复制的链接拷贝进去按回车,这样就克隆好了,然后将要备份的文件和代码都放到这个文件夹下面。
2024-09-16 00:16:58
2298
原创 C/C++内存管理
int main()//new/delete 和 malloc/free最大区别是 new/deeletc对于//自定义类型除了开空间还会调用构造函数和析构函数。//没有默认构造就会报错,当然也可以自己传参//这里有点像匿名对象,但不是匿名对象//这是在堆上new一个对象,然后构造。然后把对象的地址返回给p3free(p1);//释放空间delete p2;
2024-09-14 15:41:15
1307
原创 类和对象(下)
无论是否显示写初始化列表,每个构造函数都有初始化列表。无论是否在初始化列表显示初始化,每个成员变量都要走初始化列表初始化。构造函数初始化成员,尽量使用初始化列表初始化,那么有的使用了初始化列表初始化再使用函数体,就像我们的日期有效性的检测。
2024-09-13 17:31:42
790
原创 外排序之文件归并排序实现
外排序(External sorting)是指能够处理极大量数据的排序算法。通常来说,外排序处理的数据不能依次装入内存,只能放在读写较慢的外存储器上(通常是硬盘)。外排序通常采用的是一种"排序 - 归并"的策略。在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依次进行,将待排序数据组织为多个有序的临时文件。然后再归并阶段将这些临时文件组合为一个大的有序文件,也就是排序结果。跟外排序对应的就是内排序,我们之前的常见的排序都是内排序,他们排序思想适应的是数据在内存中,支持随机访问。
2024-09-09 01:10:49
514
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人