- 博客(49)
- 收藏
- 关注
原创 C++进阶——哈希的实现
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(log2N),即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。
2023-05-30 12:01:51
1024
1
原创 Linux一学就会——共享内存
原理就不用多讲了,之前管道通信是因为进程和子进程天然的可以看到共同的内存区域。这一次我们可以创建一个通向内存让非子进程也可以看到同一片区域进行通信。管道通信里面我们知道,要是想进行通讯就必须让两个进程看到同一片内存区域(其实也就是最开始共享内存的雏形)。共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到。内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。ctrl+c终止进程,再次重启。收到客户发来的信息!
2023-05-29 10:44:02
327
原创 Linux一学就会——线程互斥
多线程执行流共享的资源就叫做临界资源:每个线程内部,访问临界自娱的代码,就叫做临界区:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。
2023-05-29 09:33:19
963
原创 C++进阶——map&set的实现
begin()与end()STL明确规定,begin()与end()代表的是一段前闭后开的区间,而对红黑树进行中序遍历后,可以得到一个有序的序列,因此:begin()可以放在红黑树中最小节点(即最左侧节点)的位置end()放在最大节点(最右侧节点)的下一个位置,关键是最大节点的下一个位置在哪块?能否给成nullptr呢?在这里我们不用设置一个循环迭代器,begin()直接就定义为最小的那棵树枝节点(最左节点),end()不是最右节点那棵树枝而是设置成空节点。
2023-05-21 17:05:11
743
1
原创 C++进阶——map&set的使用
7. map中的的元素是键值对8. map中的key是唯一的,并且不能修改9. 默认按照小于的方式对key进行比较10. map中的元素如果用迭代器去遍历,可以得到一个有序的序列11. map的底层为平衡搜索树(红黑树),查找效率比较高12. 支持[]操作符,operator[]中实际进行插入查找。
2023-05-19 13:29:09
503
2
原创 C++进阶——红黑树
enum color //定义颜色 {color _col;} };思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?因为刚刚说的性质中第三条比第四条更好维护。
2023-05-17 11:08:07
342
原创 C++进阶——AVL树的构建
AVLTreeNode(const pair < k , v > & kv) //节点构造函数 : _left(nullptr) , _right(nullptr) , _parent(nullptr) , _kv(kv) , _be(0) {int _be;
2023-05-15 22:00:53
616
原创 Linux一学就会——管道通信
一个进程需要将它的数据发送给另一个进程:多个进程之间共享同样的资源。:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
2023-05-10 16:37:54
761
1
原创 Linux一学就会——系统文件I/O
pathname : 要打开或创建的目标文件flags : 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数 : O_RDONLY : 只读打开O_WRONLY : 只写打开O_RDWR : 读,写打开这三个常量,必须指定一个且只能指定一个O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND : 追加写返回值:成功:新打开的文件描述符失败: - 1。
2023-05-09 21:56:59
1034
原创 Linux一学就会——编写自己的shell
也就是说可变参数是放在传入参数最后,放在中间必须在输入结束之后再输入一个NULL,而且可变参数和前面放的参数类型一致。
2023-05-06 11:09:32
941
原创 C++进阶——反向迭代器Reverse_iterator
之前我们学过适配器,但是只实现了普通的迭代器,可是反向迭代器没有实现,当时说之后会实现的,没错就是今日,我们要收复Reverse_iterator-----。我们其实可以封装一个反向迭代器库(Reverse_iterator.h),这样不管是什么容器(适配器)都可以使用了,减少了代码的冗余。
2023-04-05 18:34:24
860
3
原创 STL讲解——priority_queue的实现
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。默认的堆是一个大堆,但是我今天设计的是一个默认小堆的函数,而且我的lesser是小堆比较,这是因为和单词进行对比更容易上手理解。并不想再写一个大堆出来,因为会有代码冗余,于是乎想到了构造一个仿函数,来帮我实现大于小于的函数判断。其他的细节基本没什么重点了。
2023-04-05 12:02:39
356
原创 C++习题——数组中的逆序对
然后再两个两个比较,这里的两个两个是前后跨度为2的(如图所示),然后再四个四个比较(我就按双数来了,有可能是3,4个比较;4,5个比较,都可以,重在好理解!)然后再8,8个比较直到这个变成一个大组,这个大组都是有序的啦!在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。归并排序我之前只是搞懂了原理没有怎么去实现,搞得我遇到这道题直接抓瞎了,MD气死我了!有的人喜欢搞两个函数,我觉得太麻烦了,这样子搞我更加直观。
2023-03-23 22:21:45
390
3
原创 Linux一学就会——crond任务调度
crontab -e 编辑crontab定时任务。crontab -l 查询crontab任务。crontab -r 删除所有当前用户。crontab 进行定时任务的设置。
2023-03-15 17:38:18
124
4
原创 STL讲解——模拟实现List
直接调用Ptr就可以了,这些东西都是打包好的。只需要改Ref和Ptr就可以实现调的是不是带const的变量。有了迭代器就可以实现find 、insert、erase。因为list是链表,所以先设计一个节点,双向节点。但是如果我需要const iterator怎么办?当然不是了,这就体现出stl大佬思维的灵活性了。只需要再最后\最前插入这也元素就可以了(普通迭代器很简单和之前链表(忘记了,请。这个简直神迹一般的代码,因为我不管需要。插入是在pos前的位置插入。就会调用Ref就可以了,使头结点自己连接自己。
2023-03-13 16:59:56
256
6
原创 STL讲解——模拟实现vector
在STL源码中,发现vector定义的并不是 start、size、capacity,而是start、finish、end_of_storage.这样就可以得到size()和capacity()。
2023-03-07 12:54:18
959
7
原创 STL讲解——string
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
2023-02-27 09:45:09
236
4
原创 C++进阶——继承
*很多人说C++语法复杂,其实多继承就是一个体现。**有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的面向对象语言都没有多继承,如Java。继承和组合public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。
2023-02-25 21:11:14
565
7
原创 STL讲解——模拟实现string
大厂在面试中,面试官总喜欢让学生自己来模拟实现string类,最主要是实现string类的增、删、查、改、构造、拷贝构造、赋值运算符重载以及析构函数。大家看下自己可不可以写一个string类?大家肯定会想想我刚刚这样设计一个string类吧?可是你不觉得少了好多东西吗?1.缺少(虽然可以默认生成,但是都是这种开辟空间的类肯定是不行的,析构函数会多次析构同一片区域)。2.增删查改一个都没有。3.析构函数需要自己编写。
2023-02-17 15:37:40
401
原创 C++入门——内存管理
new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造delete的原理在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数delete[]的原理在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。
2023-02-11 21:17:41
2910
1
原创 C++入门——类与对象(二)
this指针的引出Date类中有SetDate与Print两个成员函数,函数体中没有关于不同对象的区分,那当s1调用SetDate函数时,该函数是如何知道应该设置s1对象,而不是设置s2对象呢?C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。this指针的特性上面图是我们所
2023-02-08 21:17:40
259
原创 C++入门——类与对象(一)
C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。其实c++中的类就是C语言中的。
2023-02-06 20:35:24
266
原创 Linux一看就会——make/Makefile
1.会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。2.一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作3.makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
2023-01-13 11:54:21
654
2
原创 C++入门——引用、内联与auto
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。比如:李白(701年2月28日—762年12月),字太白,号青莲居士,又号“谪仙人”,唐代伟大的浪漫主义诗人,被后人誉为“诗仙”,与杜甫并称为“李杜”。这都是李白的称呼,都指代李白本人。包括你也有大名和小名,以后还会有某某某的母亲(或者父亲),某某某的老婆(或老公)等等一系列称呼。就这样你会发现打印出来的地址都是一样的,因为两个是一个变量(大小名而已)。
2022-12-14 17:35:49
344
原创 C++入门——函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。只是参数个数 或 类型 或 顺序不同这个概念太重要了。
2022-12-14 15:28:23
137
1
原创 数据结构精讲——排序(一)
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。排序无处不在今
2022-12-04 19:36:36
354
原创 新手精通数据结构——二叉树
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。:总而言之满二叉树是特殊的完全二叉树。完全二叉树是:可以不满,但不能不连续。
2022-11-20 21:32:50
284
7
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人