自定义博客皮肤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)
  • 收藏
  • 关注

原创 【C++项目】高并发内存池

当前项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。

2024-01-25 15:55:29 1205 3

原创 【AI学习从零至壹】PyTorch模型训练相关要素

在 PyTorch 中,优化器(optimizer)是⽤于更新神经⽹络参数的⼯具,它会根据计算得到的损失函数的梯度来调整模型的参数,通常是以最⼩化损失函数来改进模型的性能。批量梯度下降法是最原始的形式,就是指在每⼀次训练迭代时使⽤所有样本来进⾏梯度的更新。归⼀化也是⼀种带有参数的归⼀化计算公式。但主要⽬的是为了稳定训练过程,加速模型收敛并减少过拟合。神经⽹络模型的输出层,通常会根据训练任务的不同,⽽分为两种情况:单⼀节点的输出和多节点输出。正则化是⼀种数据筛选⽅法,作⽤是抑制过拟合,提升模型泛化能⼒。

2025-03-24 22:22:55 555

原创 【AI学习从零至壹】Pytorch神经⽹络

在深度学习中,必须要说的就是神经⽹络,或者说是⼈⼯神经⽹络(artificial neural network)。神经⽹络是⼀种⼈类受到⽣物神经细胞结构启发⽽研究出的算法体系。神经⽹络这个名字容易让⼈觉得特别神秘,不像我们接触过的程序算法那样直观,在编程的时候我们常⽤到的都是⼀些加减乘除、循环、分⽀、⽐⼤⼩、读写等等,使⽤这些基本步骤就能够完成⼀个明确的⽬标任务,然⽽神经⽹络和这种直观的⽅式还真有些不同。

2025-03-17 22:42:15 1441 3

原创 【AI学习从零至壹】Pytorch逻辑回归

数中,梯度是⼀个向量,向量有⽅向,梯度的⽅向就指出了函数在给定点的上升最快的⽅向。梯度的⽅向是函数在给定点上升最快的⽅向,那么反⽅向就是函数在给定点下降最快的⽅向,所以我们只要沿着梯度的反⽅向⼀直⾛,就能⾛到局部的最低点!由于神经⽹络模型中有众多的参数,也称为权重参数(weight parameter)所以我们常常需要处理的是多元复合函数,要想知道某⼀个权重参数对损失函数的影响,那么就要求它的偏导数。函数在某⼀点的梯度是这样⼀个向量,它的⽅向与取得最⼤⽅向导数的⽅向⼀致,⽽它的模为⽅向导数的最⼤值。

2025-03-06 01:40:49 1213 2

原创 【AI学习从零至壹】pytorch基础

在进⼀步学习pytorch之前,先要了解⼀个概念 —— 计算图( Computation graph)所有的深度学习框架都依赖于计算图来完成梯度下降、优化梯度值等计算。它能够将多个张量沿某个轴拼接成一个新的张量。PyTorch 是⼀个开源的深度学习框架,由 Facebook 的⼈⼯智能研究团队开发和维护,在学术界和⼯业界都得到了⼴泛应⽤。张量的属性描述了张量的形状、数据类型和存储它们的设备。tensorflow1.x 使⽤的是静态计算图,tensorflow2.x和pytorch使⽤的是动态计算图。

2025-03-02 22:30:33 915 1

原创 【AI学习从零至壹】Numpy基础知识

⼴播 (Broadcast) 是 numpy 对不同形状 (shape) 的数组进⾏数值计算的⽅式,对数组的算术运算通常在相应的元素上进⾏。对于多维数组,它的通⽤计算公式如下,即结果数组中的每个元素都是:数组 a 的最后⼀维上的所有元素与数组 b 的倒数第⼆位上的所有元素的乘积和:dot(a, b)[i,j,k,m]= sum(a[i,j,:] * b[k,:,m])dot : 矩阵乘法,对于两个⼀维的数组,计算的是这两个数组对应下标元素的乘积和 (数学上称之为内积);两种方式输出的内容都是一样的。

2025-02-27 22:30:35 828

原创 Linux高级IO

IO主要分为两步:第一步是等,即等待IO条件就绪。第二步是拷贝,也就是当IO条件就绪后将数据拷贝到内存或外设。任何IO的过程,都包含“等”和“拷贝”这两个步骤,但在实际的应用场景中“等”消耗的时间往往比“拷贝”消耗的时间多,因此要让IO变得高效,最核心的办法就是尽量减少“等”的时间。

2024-03-16 22:03:58 1172

原创 C++的类型转换

由于编译器认为const修饰的变量是不会被修改的,因此会将const修饰的变量存放到寄存器当中,当需要读取const变量时就会直接从寄存器中进行读取,而我们修改的实际上是内存中的a的值,因此最终打印出a的值是未修改之前的值。上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针。如果父类的指针(或引用)指向的是一个子类对象,那么将其转换为子类的指针(或引用)则是安全的。

2024-03-16 20:30:17 1292

原创 C/C++内存管理详解

class Testpublic:Test() //构造函数:_a(0)cout << "构造函数" << endl;~Test() //析构函数cout << "析构函数" << endl;一、动态申请单个类的空间//申请delete p1;//销毁//申请free(p2);//销毁二、动态申请多个类的空间//申请//销毁//申请free(p4);//销毁。

2024-02-24 22:34:55 1212

原创 C++模板进阶操作 —— 非类型模板参数、模板的特化

优点:1.模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2.增强了代码的灵活性。缺陷:1.模板会导致代码膨胀问题,也会导致编译时间变长。2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2024-02-17 22:40:43 1117

原创 C++模板详解 —— 函数模板与类模板

class 类模板名//类内成员声明public:cout << "数学:" << _Math << endl;cout << "语文:" << _Chinese << endl;cout << "英语:" << _English << endl;T _Chinese;T _English;注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。T _Chinese;T _English。

2024-02-17 22:13:09 992

原创 C++11---lambda表达式

说明一下: 实际当我们以[&]或[=]的方式捕获变量时,编译器也不一定会把父作用域中所有的变量捕获进来,编译器可能只会对lambda表达式中用到的变量进行捕获,没有必要把用不到的变量也捕获进来,这个主要看编译器的具体实现。因此每个lambda表达式的类型都是不同的,这也就是lambda表达式之间不能相互赋值的原因,我们可以通过typeid(变量名).name()的方式来获取lambda表达式的类型。实际编译器在底层对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的。

2024-02-17 21:41:19 638

原创 C++11 ——— 右值引用和移动语义

左值是一个表示数据的表达式,如变量名或解引用的指针。左值可以被取地址,也可以被修改(const修饰的左值除外)。左值可以出现在赋值符号的左边,也可以出现在赋值符号的右边。

2024-02-08 23:23:39 787

原创 传输层协议 ——— TCP协议

在进行网络通信时,一方发出的数据后,它不能保证该数据能够成功被对端收到,因为数据在传输过程中可能会出现各种各样的错误,只有当收到对端主机发来的响应消息后,该主机才能保证上一次发送的数据被对端可靠的收到了,这就叫做真正的可靠。但TCP要保证的是双方通信的可靠性,虽然此时主机A能够保证自己上一次发送的数据被主机B可靠的收到了,但主机B也需要保证自己发送给主机A的响应数据被主机A可靠的收到了。

2024-02-08 22:16:10 1300

原创 C++11智能指针

而如果连接结点时只进行一个连接操作,那么当node1和node2的生命周期结束时,就会有一个资源对应的引用计数被减为0,此时这个资源就会被释放,这个释放后另一个资源的引用计数也会被减为0,最终两个资源就都被释放了,这就是为什么只进行一个连接操作时这两个结点就都能够正确释放的原因。其次,shared_ptr中的引用计数count也不能定义成一个静态的成员变量,因为静态成员变量是所有类型对象共享的,这会导致管理相同资源的对象和管理不同资源的对象用到的都是同一个引用计数。

2024-02-06 10:59:00 976

原创 应用层协议 ——— HTTP协议

HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,是一个简单的请求-响应协议,HTTP通常运行在TCP之上。在编写网络通信代码时,我们可以自己进行协议的定制,但实际有很多优秀的工程师早就已经写出了许多非常成熟的应用层协议,其中最典型的就是HTTP协议。

2024-02-02 21:25:10 871

原创 认识“协议”

客户端可以按某种方式将这些结构化的数据组合成一个字符串,然后将这个字符串发送到网络当中,此时服务端每次从网络当中获取到的就是这样一个字符串,然后服务端再以相同的方式对这个字符串进行解析,此时服务端就能够从这个字符串当中提取出这些结构化的数据。客户端可以定制一个结构体,将需要交互的信息定义到这个结构体当中。比如现在要实现一个网络版的计算器,那么客户端每次给服务端发送的请求数据当中,就需要包括左操作数、右操作数以及对应需要进行的操作,此时客户端要发送的就不是一个简单的字符串,而是一组结构化的数据。

2024-02-02 12:25:01 1268

原创 网络编程套接字(3)

之前我们是以回调的方式处理任务的,当线程池当中的线程从任务队列中拿出一个任务后,会调用该任务对应的Run方法处理该任务,而实际在这个Run方法当中会以仿函数的方式调用handler方法,因此我们只需更改Handler类当中对()的重载函数即可,而其他与通信相关的代码我们一律不用更改。(这里我们只是做测试的,就不做过多的设计了)建立连接后,TCP协议提供全双工的通信服务,所谓全双工的意思是,在同一条连接中,同一时刻,通信双方可以同时写数据,相对的概念叫做半双工,同一条连接在同一时刻,只能由一方来写数据。

2024-02-02 12:11:06 629

原创 网络编程套接字(2)

由于调用pthread_create函数创建线程时,新线程的执行例程是一个参数为void*,返回值为void*的函数。如果我们要将这个执行例程定义到类内,就需要将其定义为静态成员函数,否则这个执行例程的第一个参数是隐藏的this指针。在线程的执行例程当中会调用Service函数,由于执行例程是静态成员函数,静态成员函数无法调用非静态成员函数,因此我们需要将Service函数定义为静态成员函数。

2024-02-01 23:59:32 878

原创 网络编程套接字

因为服务器就是为了给别人提供服务的,因此服务器必须要让别人知道自己的IP地址和端口号,IP地址一般对应的就是域名,而端口号一般没有显示指明过,因此服务端的端口号一定要是一个众所周知的端口号,并且选定后不能轻易改变,否则客户端是无法知道服务端的端口号的,这就是服务端要进行绑定的原因,只有绑定之后这个端口号才真正属于自己,因为一个端口只能被一个进程所绑定,服务器绑定一个端口就是为了独占这个端口。因为身份证号是国家用于行政管理时用的编号,而学号是学校用于管理学生时用的编号,工号是公司用于管理员工时用的编号。

2024-02-01 22:22:02 1032

原创 Linux线程安全

站在操作系统的角度,进程等待某种资源,就是将当前进程的task_struct放入对应的等待队列,这种情况可以称之为当前进程被挂起等待了。站在用户角度,当进程等待某种资源时,用户看到的就是自己的进程卡住不动了,我们一般称之为应用阻塞了。这里所说的资源可以是硬件资源也可以是软件资源,锁本质就是一种软件资源,当我们申请锁时,锁当前可能并没有就绪,可能正在被其他线程所占用,此时当其他线程再来申请锁时,就会被放到这个锁的资源等待队列当中。

2024-01-30 12:15:37 1550

原创 Linux多线程详解

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。1.一切进程至少都有一个执行线程。2.线程在进程内部运行,本质是在进程地址空间内运行。3.在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。4.透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

2024-01-30 08:00:00 1012

原创 Linux进程信号

1.执行该信号的默认处理动作。2.提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号。3.忽略该信号。在Linux当中,我们可以通过man手册查看各个信号默认的处理动作。

2024-01-29 12:28:46 938

原创 Linux进程间通信

之前我们说过,当管道的读端进程退出后,写端进程再向管道写入数据就没有意义了,此时写端进程会被操作系统杀掉,在这里就可以很好的得到验证:当我们终止掉读端进程后,因为写端执行的循环脚本是由命令行解释器bash执行的,所以此时bash就会被操作系统杀掉,我们的云服务器也就退出了。进程间通信的本质就是,让不同的进程看到同一份资源,使用匿名管道实现父子进程间通信的原理就是,让两个父子进程先看到同一份被打开的文件资源,然后父子进程就可以对该文件进行写入或是读取操作,进而实现父子进程间通信。

2024-01-28 23:26:06 1000

原创 【Qt无门槛入门】信号以及信号机制及其常用控件(1)

Qt框架默认提供的标准信号和槽不足以完成我们日常应用开发的需求,比如说点击某个按钮让另一个按钮的文字改变,这时候标准信号和槽就没有提供这样的函数。但是Qt信号和槽机制提供了允许我们自己设计自己的信号和槽。第一种自定义槽函数的方法此处的slots是Qt自己扩展的关键字,Qt里广泛使用了元编程技术(基于代码,生成代码)qmake构建Qt项目的时候,就会调用专门的扫描器,扫描代码中特定的关键字。第二种自定义槽函数的方法在Qt中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接。

2024-01-27 21:22:33 1308

原创 QT入门篇---无门槛学习

Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤ Qt 框架进⾏应⽤程序开发⽽设计。它是⼀个功能强⼤、易于使⽤、快速且⾼效的⼯具,被⼴泛⽤于编写各种类型的应⽤程序,如桌⾯应用程序、移动应⽤程序和嵌⼊式系统等。Qt Creator 提供了⼀个可视化的界⾯设计器和代码编辑器,可以帮助开发者更快捷地创建复杂的用户界面和处理各种事件。它还包含了调试⼯具、版本控制⼯具、⾃动完成和智能提⽰等功能,以及⽀持多语⾔和跨平台的开发环境。

2024-01-25 21:38:51 2129

原创 Linux进程控制

多进程运行,需要独享各种资源,多进程运行期间互不干扰,不能让子进程的修改影响到父进程,所以产生了写时拷贝,子进程不一定会使用父进程的所有数据,并且在子进程不对数据进行写入的情况下,没有必要对数据进行拷贝,我们应该按需分配,在需要修改数据的时候再分配(延时分配),这样可以高效的使用内存空间。一个父进程可以创建多个子进程,而一个子进程只能有一个父进程。而对于父进程来说,子进程是需要被标识的,因为父进程创建子进程的目的是让其执行任务的,父进程只有知道了子进程的PID才能很好的对该子进程指派任务。...

2022-07-30 11:28:21 525 1

原创 Linux进程概念

当一个进程将要退出的时候,在系统层面,该进程曾经申请的资源并不是立即被释放,而是要暂时存储一段时间,以供操作系统或是其父进程进行读取,如果退出信息一直未被读取,则相关数据是不会被释放掉的,一个进程若是正在等待其退出信息被读取,那么我们称该进程处于僵尸状态.一个进程从创建而产生至撤销而消亡的整个生命期间,有时占有处理器执行,有时虽可运行但分不到处理器,有时虽有空闲处理器但因等待某个时间的发生而无法执行,这一切都说明进程和程序不相同,进程是活动的且有状态变化的,于是就有了进程状态这一概念。...

2022-07-27 10:25:56 1283 5

原创 Linux项目自动化构建工具

make/Makefile背景背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力. 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作.makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释ma

2022-07-18 11:35:59 334

原创 【STL】位图的介绍使用以及代码的模拟实现

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。1.构造一个16位的位图,所有位都初始化为0。构造一个16位的位图,根据所给值初始化位图的前n位。3.构造一个16位的位图,根据字符串中的0/1序列初始化位图的前n位。成员函数的介绍成员函数功能set设置指定位为1reset清空指定位flip反转指

2022-07-13 10:08:58 390 3

原创 哈希表,哈希桶的实现

顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( ),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。、向该结构当中:插入元素: 根据待插入元素的关键码,用此函数计算出

2022-07-09 10:31:01 1140 4

原创 【STL】unordered_set和unordered_map

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同.1.构造一个空容器2.拷贝构造一个空间3.使用迭代器构造一段区间的内容unordered_map的函数接口说明成员函数功能in

2022-07-07 10:57:24 442 4

原创 【STL】map和set的使用

我们之前学习的vector list是序列式容器因为其底层为线性序列的数据结构,里面存储的是元素本身。

2022-07-04 12:03:28 437 7

原创 二叉搜索树

二叉搜索树概念二叉搜索树又称为二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。若它的右子树不为空,则右子树上所有结点的值都大于根结点的值。它的左右子树也分别是二叉搜索树。int a[]={5,3,4,1,7,8,2,6,0,9}二叉搜索树的查找定义一个树节点节点中包括三个值:节点值,左指针,右指针节点类当中只需实现一个构造函数即可,用于构造指定节点值的节点。 struct BSTreeNode { K _ke

2022-07-01 18:27:43 551 6

原创 【MySQL】表的增删改查(进阶)

表的增删改查数据库的约束概念数据库的约束概念约束:数据库针对数据进行一系列的校验,如果发现插入的数据不符合约束中描述的校验规则,就会插入失败,为了更好的保证数据的正确性。1.not null:不能插入空的数据。2.unique:该列的所有行的数据是不能重复的。两个约束叠加3.default 给列执行默认值4.primary key主键等价于not null + unique...

2021-12-04 15:46:57 1441 10

原创 【MySQL】表的增删改查

表的增删改查增删改查1.插入数据2.查看数据增删改查1.插入数据insert into [表名] values (对应的字段内容);插入的字段的数目和类型需要和表结构中要求的一致。指定列插入,根据需要只插入其中的某几列2.查看数据select* from[表名];*是一个通配符,意思是把所有的列都查找。...

2021-11-07 16:35:28 1537 7

原创 C++多态的理解

多态的理解概念虚函数三级目录概念多态:就是多种形态。静态的多态 — 函数重载动态的多态 — 父类指针或引用调用虚函数1.父类指针或引用指向父类,调用的就是父类的虚函数2.父类指针或引用指向哪个子类,调用的就是子类的虚函数。虚函数虚函数:成员函数前面加virtual称为虚函数注意的问题:1.只有类的非静态成员函数可以是虚函数2.虚函数这里virtual和虚继承中用的virtual是同一个关键字,但是他们之间没有关系。三级目录...

2021-11-03 20:32:49 1044 1

原创 【MySQL】数据库的基本认识

数据库的基本操作基本操作1.查看数据库2.创建数据库3.使用数据库4.删除数据库常用的数据类型数值类型字符串类型表的操作1.创建表操作2.查看表结构3.删除表查看当前有哪些表基本操作1.查看数据库MySQL服务器是一个数据库软件,这个软件运行过程中可以维护多个”逻辑“上的数据库。命令: show databases;2.创建数据库命令: create database [数据库名];3.使用数据库当前有多个数据库,通过“使用操作”,就能选中某个数据库,接下来的命令都是针对这个数据库来生效

2021-10-31 15:41:37 5607 7

原创 【算法训练营】(day12)

算法训练营不要二把字符串转换成整数不要二解题思路:本质是在二维数组中每个坐标去放蛋糕,一个坐标位置放了蛋糕,跟他欧几里得距离为2的位置不能放蛋糕,如果(x1,y1)放了蛋糕,则满足((x1-x2)(x1-x2)+(y1-y2)(y1-y2))==4的(x2,y2)不能放蛋糕。可以用加法表达式分解最后得知两个表达式一个等于0,一个等于4时表达式成立。int main(){ int w, h, count = 0; cin >> w >> h; vector<ve

2021-10-27 18:58:03 214 2

原创 【算法训练营】(day11)

算法训练营统计回文连续最大和统计回文解题思路:遍历str1,将str2插入str1的每个位置,判断是否回文,是就++count;需要注意的是这里不能直接用str1,这样的话str1就改变了,判断下一个位置就不对了。bool reverse(string s){ int begin = 0; int end = s.size() - 1; while (begin < end) { if (s[begin] != s[end]) { return false; }

2021-10-25 22:31:16 259 4

空空如也

空空如也

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

TA关注的人

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