- 博客(46)
- 收藏
- 关注
原创 c++sort比较进阶
/也可以从大到小,可以自行试验: return a[0] == b[0]?//二维数组比较,先根据第一个元素排序,如果第一个元素相等,再根据第二个元素排序。//除此之外,c++还提供了greater和less。
2025-04-16 14:35:52
187
原创 内存映射区
存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据,就相当于读文件中的相应字节;将数据写入缓冲区,则会将数据写入文件。这样,就可在不使用read和write函数的情况下,使用地址(指针)完成I/O操作。使用存储映射这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。
2024-10-31 16:21:55
556
原创 linux进程间通信简介
任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。管道是一种最基本的IPC机制,也称匿名管道,应用于有血缘关系的进程之间,完成数据传递。
2024-10-31 11:23:26
345
原创 exec函数族简介
exec函数是用一个新程序替换了当前进程的代码段、数据段、堆和栈;原有的进程空间没有发生变化,并没有创建新的进程,进程PID没有发生变化。有的时候需要在一个进程里面执行其他的命令或者是用户自定义的应用程序,此时就用到了exec函数族当中的函数。使用方法一般都是在父进程里面调用fork创建处子进程,然后在子进程里面调用exec函数。
2024-10-31 10:55:25
323
原创 进程、孤儿进程、僵尸进程、fork、wait简介
如:若将CPU的1S的时间分成100个时间片,每个进程执行完一个时间片必须无条件让出CPU的使用权,这样1S中就可以执行100个进程。并行指两个或两个以上的程序在同一时刻发生(需要有多颗cpu,现在我们电脑的cpu都是多核)。就是说,有多个cpu上同时运行着不同程序。进程:一个启动的程序, 进程占用的是系统资源,如:物理内存,CPU,终端等,是一个动态的概念。并发,在一个时间段内, 是在同一个cpu上, 同时运行多个程序。程序:是指编译好的二进制文件,在磁盘上,占用磁盘空间, 是一个静态的概念.
2024-10-30 12:15:08
630
原创 linux下的文件io操作
也就是说,c中的fopen是对open的一层封装。fopen里边调用的就是open函数,同理,liux下的read、write函数和c中的读写函数与open和fopen的关系类似。下边写一个简单的io测试案例:创建文件file_io_test.c,写如下代码,如果某个函数忘记,可以直接在linux下man 2 open查看帮助手册。Linux系统的IO函数默认是没有缓冲区.linux下的文件io操作主要涉及要几个函数:open、write、read、close、lseek、perror和errno。
2024-10-30 10:14:35
502
原创 makefile如何编写?
什么是makefile?makefile文件中定义了一系列的规则来指定, 哪些文件需要先编译, 哪些文件需要后编译, 哪些文件需要重新编译, 甚至于进行更复杂的功能操作, 因为makefile就像一个Shell脚本一样, 其中也可以执行操作系统的命令. makefile带来的好处就是——“自动化编译”, 一旦写好, 只需要一个make命令, 整个工程完全自动编译, 极大的提高了软件开发的效率.
2024-10-30 09:25:15
409
原创 c语言手撕内存池组件
内存池通过创建一个“池子”来管理这些小块,以便在需要时快速分配和回收内存,而不需要每次都调用系统的内存分配函数(如。如果释放某个内存块以后,我们下一个可以分配的内存块应该指向刚刚释放的那个内存块,问题是怎么找到它呢?在不同的业务场景下内存池通常也都不一样,在初学内存池阶段,我们实现一个固定块的内存池(在内存池里分配大小一样的小块)。通过预先分配一大块内存,程序可以在需要时从这个预先分配的内存中快速获取内存块,并在不使用时归还给池子,从而减少频繁的分配和释放操作。
2024-09-27 17:53:54
425
1
原创 142. 环形链表 II(C++)
第一种方法比较简单,遍历链表,使用unordered_set保存(insert)遍历到的节点,继续遍历下去,如果unordered_set存的有这个节点(用count方法,查找unordered_set中的元素出现的个数,unordered_set中元素唯一且无序,此函数相当于查询element是否出现),这个节点就是环的入口结点,返回这个节点即可。第二种方法答案给的不太清晰,有一篇其他人写的还不错的分享一下。
2024-09-26 09:46:52
244
原创 qps测试epoll和io_uring
QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 我们可以写一个客户端的代码,分别对epoll实现的Reactor服务器和io_uring实现的Proactor服务器进行测试。客户端大致流程:对服务端发起请求到接收到服务器回发的数据,统计期间的时间。通过上述测试,可以大致看出io_uring实现的异步Proactor性能的qps比epoll实现的同步Reactor性能要好。
2024-08-24 08:26:24
569
原创 C语言中函数sizeof和strlen区别
函数只适用于以null字符结尾的C风格字符串,即使用字符数组表示的字符串。如果传入一个指针指向非法内存区域或者没有以null字符结尾的字符序列,将导致未定义行为(undefined behavior)。是C语言中的两个常用函数,它们的作用和使用方式有所不同。计算以null字符结尾的字符串的长度。计算数据类型或变量占用的字节数,而。
2024-08-21 11:55:42
335
原创 io_uring实现Proactor
上一次我们用epoll实现了reactor模式,这一次我们用io_uring来实现Proactor模式的tcp服务器。我们已经可以达到用一个线程去处理大量的连接。但此时这个线程每处理一个I/O,线程会一直等待(就是我们常说的阻塞I/O或者同步I/O下边有解释),是不是有点傻瓜?是否可以让线程多工作,别傻傻的等待。当然可以!这就是今天我们所要介绍的目前常用的Proactor模式。:I/O操作按照顺序执行,并且每一步都需要等待上一步完成。
2024-08-18 17:22:21
1000
原创 C语言实现Reactor
在前边的C语言实现简易tcp服务器中,我们实现服务器是采用了最笨拙的方法,就是每来一个客户端,我们就创建一个线程进行连接处理。试想如果有10w个客户端来,就需要10w个线程,需要创建大量的线程,耗费大量的资源,并且为了保证线程安全,还需要考虑锁,死锁等问题,这些都需要一定的开销。因此为了解决这个问题,我们下一篇介绍了select、poll、epoll,他们三个是常用的I/O多路复用机制。解决了创建大量的线程的问题。用一个线程就可以去处理多个客户端连接的问题。那么问题来了,性能是否还能继续优化?
2024-08-18 17:16:51
354
原创 select、poll、epoll
select是Linux中常用的多路复用IO机制,它允许程序同时监控多个文件描述符(可以是套接字socket,也可以是普通文件)的读、写和异常事件。//参数://maxfd:监视对象文件描述符数量。//readset:将所有关注“是否存在待读取数据”的文件描述符注册到fd_set变量,并传递其地址值。//writeset: 将所有关注“是否可传输无阻塞数据”的文件描述符注册到fd_set变量,并传递其地址值。
2024-08-03 20:16:32
447
原创 C语言实现简易tcp服务器
用网络调试助手模拟多个客户端,实现的tcp服务器功能:客户端发送什么数据,再转发回去。代码采用一个客户请求创建一个线程进行处理的方式。才看完tcp协议这一块,写这篇博客的目的主要是为了加深印象,把大致流程梳理下。
2024-07-30 21:58:59
338
原创 DNS简介以及c语言实现DNS域名解析
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为 将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。如果我们想要去访问百度,通常我们回输入百度的域名:"www.baidu.com"。但其实我们访问互联网时,计算机网络提供的都是由数字构成的IP地址(如“43.139.121.27"),这种IPV4地址很难记住,因此他来了,DNS服务的出现,建立了IP地址(43.139.121.27)和域名(www.baidu.com)之间的对应关系。
2024-07-16 17:41:47
1308
原创 如何使用SSh连接虚拟机
勾选上Specify username,然后填上自己虚拟机账户名(我设置的是user)Remote host:填inet后边的地址(前边我们找到的地址)1.在打开的虚拟机里输入 ip addr。找到inet后边的地址(后边要用到)
2024-05-29 10:44:10
532
原创 LeetCode第12题 整数转罗马数字
方法二(官方答案):用到了C++17的特性(如果在vs中运行代码需要在项目属性中修改C++语言标准,改成C++17标准,具体看下图)
2024-05-04 17:06:00
213
原创 QT错误:error: undefined reference to `vtable for ‘xxxxxxx‘
先仔细检查代码,如果代码没错,选中项目执行qmake(Run qmake),然后编译就能通过。
2024-04-26 18:02:05
192
1
原创 vs2019C/C++访问MySQL数据库报错:找不到libmysql.dll,无法继续执行代码。
前七步执行完以后,如果仍然报错找不到libmysql.dll错误,则把第七步找到的ibmysql.dll文件复制到项目目录下,再去执行应该就没问题了。:打开mysql的安装目录,默认安装目录如下:C:\Program Files\MySQL\MySQL Server 8.0,确认。:把mysql安装目录里的lib\libmysql.dll复制到c:\windows\system32下,运行自己的代码。:打开VC++目录,在包含目录中,将mysql安装文件中的include文件的路径添加到这里。
2024-04-06 15:07:11
1903
2
原创 数据库MySQL8中文分词配置
配置文件(win10默认在目录C:\ProgramData\MySQL\MySQL Server 8.0下的)my.ini,可以用记事本方式打开。(不一定非要等于2,在这等于2的意思是当使用中文索引时,它是按照两个两个中文来查找的,也就是说当你输入一个汉字进行检索时,检索不到。最后一步:添加完命令保存后,重启MySQL服务(如下)。找到对应的位置,添加一行如下命令即可(
2024-04-04 11:18:36
548
1
原创 c++中iterator作用
STL被组织为下面的个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack> 和<utility>。STL中的迭代器、容器、算法这三个是密不可分的,当我们使用容器(vector、list等)去存储数据时,通常可以使用迭代器去遍历数据。1.iterator(迭代器)——可以遍历STL容器内全部或者部分元素的对象。
2024-03-19 16:25:58
212
1
原创 纯虚函数与抽象类
某些类,不需要实例化(不需要创建它的类对象),这个类中定义的某些成员函数,只提供了一个形式上的接口,子类来做具体的实现。此时,这个方法就是所谓的”纯虚函数“,而包含虚函数的类,就称为抽象类。
2024-03-05 18:48:11
141
原创 c++中子类析构函数未调用的情况
如果对 Father类的指针使用delete操作时,就会对该指针使用“动态析构”。如果这个指针指向的是子类对象,那么会先调用该子类的析构函数,再调用自己类的析构函数。执行完上述代码后,结果为:没有调用Son类的析构函数。把Father类的析构函数定义为virtual函数。
2024-03-05 17:44:09
419
1
原创 c++继承中的虚函数表
上述代码中的Son类对父类和母类都进行了继承,在Son类中重写了Father中的func1函数,而Father中的func2函数没有被重写,子类中新写了一个fun3函数,故子类继承完Father类的虚函数表如上图前半部分。形式上,使用统一的父类指针做处理,但在实际中,这个指针可能指向的子类对象。看起来是调用父类的方法,但是实际中会调用子类的同名方法。3.如果子类增加了新的虚函数,就把这个虚函数添加到虚函数表中(在尾部添加)想查看其他类的虚函数表只需改最后的类名即可,其他的不需要改。
2024-03-05 14:16:14
254
原创 c++中const导致的异常错误
经验:我们在定义方法的时候,如果这个方法不会改变里边的数据(就是说我们不需要改变里边的数据),我们加一个const没有什么坏处。加入const后,此时常量对象和普通对象都可以调用。不加const的话,常量对象没法调用。,调用到如下函数去了,参数为0(int类型)传到string里,会报错。name是自由指针,"小红"是常量。错误2:相对隐藏较深的情况,编译不会报错,运行会出错。,在主函数中我们新建一个常量对象,输出时调用了。编译找不到问题,运行会报错!const对象只能调用const方法。
2024-03-01 17:20:32
526
1
原创 c++中输入输出运算符的重载
cout << "年龄:" << age << "\t\t性别:" << sex << "\t\t学号:" << id;cout<< "年龄:" << s1.age << "\t\t性别:" << s1.sex << "\t\t学号:" <<s1.id;s1 << "年龄:" << age << "\t\t性别:" << sex << "\t\t学号:" << id;为什么不推荐使用这种方式呢,跟我们正常输出不太一样。//非常之别扭,所有不推荐。语句的话,相当于:s1.operator<<(cout),
2024-02-29 17:51:21
300
原创 c++中ifstream和ofstream区别
我在这给出我的理解,可能不对,仅供参考:首先是对文件进行操作,那肯定要用到ifstream/ofstream对文件进行输入和输出。//打开文件num.txt(假设有这样一个文件,并且文件中都是整型数)也就是说,在c++中,必须通过特定的已经定义好的类,来处理IO(输入输出),以上图帮助我们理解。ifstream相当于文件输入,使用ofstream时要特别区别>>和<<这两个符号的使用。中,反着说,也就是stream被num输出,就用ofstream)
2024-02-26 20:35:35
463
1
原创 vs2022中编译后没有.exe文件解决办法
第二布:选中test-double项目这个项目单击右键,在链接器中的输出文件进行修改,把刚刚复制的目录粘贴进去,并且(注意这布操作至关重要)在最后加上.exe,点击确定,编译后就会出现.exe文件。第一步:打开文件所在的文件夹复制目录: E:\aaaaaaaa\cpp\01基础项目\test-double\Debug。以test-double项目为例,仅作记录。第三步:编译后打开文件出现.exe文件。
2023-12-27 21:33:37
9629
5
原创 cmd的cd命令不能进入到复制好的路径解决办法
同时按win+r键后选择cmd打开,复制了一个文件目录路径,如:E:\aaaaaaaa\111\git。然后我就输入了E:(是我复制路径的盘),回车就进去了。输入cd命令后把目录复制进去却没效果。
2023-12-27 21:20:10
479
1
原创 vs中如何清空输入缓冲区
在C++的标准中,cin.sync()是清空缓冲区,理论上调用这个函数可以清空,但在实际中是否清空缓冲区取决于编译器。c语言风格的flush(stdin)在vs的编译器中没有效果,在其他编译器中可能会有效果,如:vc++//相当于是一个一个字符去清空缓冲区,直到遇到回车符结束,使用前调用函数ClearBuffer()即可。如果使用其他的编译器是可能可以的,如:vc++等,但在vs中的编译器就不行。在vs中有效的清空输入缓冲区方式。(1)c++风格的cin.sync()在vs中失效!使用时输入这一行即可。
2023-12-22 16:42:32
693
空空如也
请问如何入门机器学习
2023-09-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人