起个别名
这个作者很懒,什么都没留下…
展开
-
STL必须掌握的几大常见算法
快速排序(Quicksort)快速排序是std::sort的主要排序算法。它的时间复杂度为平均O(n log n),最坏情况下为O(n^2)。快速排序通过选择一个“基准”元素,并将数组分成两个子数组,将小于基准的元素放在基准的左边,大于基准的元素放在右边。然后递归地对两个子数组进行排序。为了减少最坏情况的可能性,C++ 标准库的实现会使用一些优化策略,比如随机选择基准元素,或者使用三数取中法(median-of-three)来选择基准。堆排序(Heapsort)原创 2024-08-16 20:24:33 · 53 阅读 · 0 评论 -
【shell脚本】
shell脚本很简单,就是一些指令,我仅用来用作项目自起或者一键编译等功能,所以只记录这两种功能的相关用法与指令。原创 2024-08-15 12:27:25 · 91 阅读 · 0 评论 -
详解select、poll、epol
这些都是在IO多路复用,也就是在服务端如何处理多个客户端的请求事件,一个常见的思路就是采用多线程:对于不同的事件,新开一个线程,单独处理该事件。但是存在的弊端是:开辟线程会创建线程栈会消耗资源,且不同线程会进行CPU的上下文切换,切换时要处理多个操作句柄,所以多线程不是好的方案。 首先用一个描述符集合也就是数组监听多个文件描述符,存储了多个监听的fd,然后将这个数组FD_SET转为bitmap,select会将这个bitmap会从用户态拷贝进入内核态,在内核中通过遍历的方式以阻塞的方式判断是否原创 2024-05-06 12:15:07 · 445 阅读 · 0 评论 -
详解数据结构-树、单调队列、优先级队列、哈希表
【代码】详解数据结构-树、单调队列、优先级队列。原创 2024-05-07 10:45:50 · 769 阅读 · 1 评论 -
七大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、归并排序、快速排序
以下内容转载自。原创 2024-05-25 15:51:23 · 1285 阅读 · 0 评论 -
详解TCP和UDP通信协议
一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和粘包问题。原创 2024-07-08 10:53:11 · 727 阅读 · 0 评论 -
万字长文带你搞懂yolov5和yolov8以及目标检测相关面试
针对IoU和GIoU损失所存在的问题,DIoU为了解决如何最小化预测框和GT框之间的归一化距离这个问题,DIoU Loss考虑了预测框与GT框的重叠面积和中心点距离,当GT框包裹预测框的时候,直接度量2个框的距离,因此DIoU Loss的收敛速度更快一些。在yolo系列算法中,针对不同的数据集,都需要设定特定长宽的锚点框。在网络训练阶段,模型在初始阶段,模型在初始锚点框的基础上输出对应的预测框,计算其与GT框之间的差距,并执行反向更新操作,从而更新整个网络的参数,因此设定初始锚点框是比较关键的一环。原创 2024-07-23 12:56:11 · 1360 阅读 · 0 评论 -
一文带你上手git并使用git工具在github上创建(上传、关联)自已的项目
git reset --hard 回退到上一个id的版本,hard:将暂存区和工作区的修改都删除、mixed(默认):只删除暂存区的修改、soft:保留工作区和暂存区的修改。git reset HEAD HEAD是一个指针,指向最近一次提交,即回退到最近一次的提交,取消(删除)暂存区的修改,修改只在工作区了。git commit -m "first" 将未被提交的文件,也就是暂存区的所有文件提交到本地仓库,并附带提交说明。原创 2024-07-26 15:12:29 · 271 阅读 · 0 评论 -
数组和指针有什么区别
ps:传入为char a[10]这样的char * 型数组,函数参数为char * 类型接收,同理返回char a[10]用char * 接收, 此时要接受char *的函数参数时,是声明char *的指针指向它的。是一个指针,指向一个字符串常量,字符串常量的生命周期贯穿程序的整个运行期。因此,返回这个指针是安全的。一旦函数返回,这个数组的内存会被释放,返回指向这个数组的指针会导致指针悬空。函数参数中传递一个预分配的字符数组,然后在函数中填充它。是一个局部字符数组,定义在栈上,这个数组的生命周期是函数。原创 2024-08-01 10:52:01 · 317 阅读 · 0 评论 -
【C++ Allocator】 详解C++的空间配置器和vector的底层实现以及push_back()和empalce_back()的区别
用于管理动态内存分配和释放,STL 容器类(如std::liststd::map等)都使用配置器来管理内存。这样能够高效的插入元素以及删除元素。原创 2024-08-12 15:22:41 · 355 阅读 · 0 评论 -
CMake详解-捡重要的讲
通常我们使用cmake构建C++项目,其实就是编写CMakeLists.txt文件,过程如下首先在创建项目名称,我这里是CMake文件夹,在路径下创建CMakeLists.txt文件,也就是在工作空间的目录下创建,具体有几个要素要设置如下(截图好看点)在main.h中编写如下代码仅做函数的声明在main.cpp中编写如下代码做函数的实现在src中创建一个CMakeLists.txt,将src写的所有文件编译成一个库,编写如下。原创 2024-08-13 13:13:33 · 845 阅读 · 0 评论 -
【python全网最好教程】 捡重要的讲
list是一个先进先出的数据结构,也就是说,mylist.pop()会从mylist中弹出最后一个元素两个列表的+操作,表示组合mylist * 5 表示重复,不是值的5倍,注意append:追加,即原封不动push到末尾,针对:单元素、序列(列表、元组、字典)extend:将序列元素的元素取出来push到末尾,针对序列(列表、元组、字典)原创 2024-08-14 10:11:26 · 609 阅读 · 0 评论 -
C/C++文件IO操作
现在很多也还在使用C的标准库进行文件IO,所以有必要讲一下。原创 2024-08-14 11:07:13 · 199 阅读 · 0 评论 -
C++11语言级别的对线程编程
得到任务的返回结果的一个封装,类型即为future,通过get方法得到真正的结果,此时肯定是阻塞返回,也就是要等到线程把任务执行完,获取任务执行完的结果后,用户线程这里才会接收到。用户提交任务、线程执行任务、用户获取任务返回结果这是异步的过程,所以针对这样的问题:线程池分配线程执行任务得到结果,这个结果类型是不定的,线程池只能使用一种通用的类型来接收结果,可以看我这篇。都是 C++11 中引入的并发编程工具,用于在多线程环境中进行任务的管理和异步执行。原创 2024-05-26 19:12:32 · 307 阅读 · 0 评论 -
C++进阶四:C++模板编程
模板代码只能同一实现,不能先声明,再在另一文件实现,模板代码都是放在头文件当中的,在头文件中直接实现。原创 2024-06-07 15:58:27 · 125 阅读 · 0 评论 -
C++进阶三:类和对象的细节原理
面向对象四大特性::抽象是一种将对象的共同特征提取出来并定义成一个通用模板的过程。类的抽象是指将一个类的共同属性和行为抽象出来,定义一个通用的类模板,而不关注具体的实现细节。:数据和代码捆绑在一起,避免外界干扰和不确定性访问。封装可以使得代码模块化。优点:确保用户代码不会无意间破坏封装对象的状态;被封装的类的具体实现细节可以随时改变,而无须调整用户级别的代码。:让某种类型对象获得另一个类型对象的属性和方法,继承可以扩展已存在的代码。原创 2024-06-07 15:58:08 · 536 阅读 · 0 评论 -
C++进阶五:运算符重载
注意+运算符重载是返回一个新对象,而直接返回临时对象,对代码进行了优化=运算符重载就是返回自己本身对象,不过要先释放自己原先的内存(如果有动态开辟的话)原创 2024-06-07 15:57:47 · 141 阅读 · 0 评论 -
C++进阶六:继承和多态
一个类里面定义了虚函数,那么编译阶段,编译器给这个类类型产生一个唯一的vftable虚函数表,虚函数表中主要存储的内容就是RTTI指针(类类型信息指针)和虚函数的地址。当程序运行时,每一张虚函数表都会加载到内存的.rodata区。原创 2024-06-07 15:57:23 · 599 阅读 · 0 评论 -
C++进阶7:STL六大组件
有迭代器,没有find,只有泛型算法的find(因为有迭代器,所以可以使用),有insert、erase(因为有迭代器,所以可以使用),有back()、front()原创 2024-06-07 15:56:16 · 793 阅读 · 0 评论 -
C++进阶一:代码编译和运行时的调用堆栈
目录运行时进程的虚拟地址划分函数调用堆栈 程序编译链接原理每一个进程的用户空间是私有的,内核空间是共享的原创 2024-06-07 15:48:41 · 128 阅读 · 0 评论 -
C++11 - 右值引用
转载文章:链接原创 2024-06-02 16:57:17 · 296 阅读 · 0 评论 -
C++进阶二
带有形参默认值的函数是指在函数声明或定义中为一个或多个参数提供默认值,以便在调用函数时可以选择省略这些参数。当省略具有默认值的参数时,函数将使用预先定义的默认值来执行。需要注意:1 给默认值的时候,从右向左给2 定义出可以给形参默认值,声明也可以给形参默认值3 形参给默认值的时候,不管是定义处给,还是声明处给,形参默认值只能出现一次。原创 2024-06-02 16:53:28 · 1187 阅读 · 0 评论 -
80个GitHub上c/c++学习项目推荐——拎几个出来写进简历
①语言:c++②来源:GitHub 目前star:4.8k③项目地址:https://github.com/yuesong-feng/30dayMakeCppServer④类型:免费。原创 2024-06-01 11:17:59 · 3135 阅读 · 0 评论 -
C++:友元
友元(friend)是 C++ 中的一个关键字,用于建立类之间的友好关系;通过友元关系,一个类可以授权其他类或函数访问其私有成员或受保护成员,从而突破了 C++ 中的封装性;友元可以是类或函数,可以出现在类的声明中,也可以出现在类的外部,在声明中,友元关键字表明了某个函数或类是另一个类的友元,从而被授权访问该类的私有或受保护成员。友元关系为双向授权,即如果类 A 是类 B 的友元,但是类 B 不一定是类 A 的友元。原创 2024-06-01 10:27:09 · 309 阅读 · 0 评论 -
Windows 平台中静态链接库和动态链接库
在编写代码时引用这些静态连接库时,编译器会将所需的函数和数据从库中提取出来,并将它们直接嵌入到最终的可执行文件中。: 编写你的 DLL 的源代码,包括需要导出的函数、变量以及其他需要在 DLL 中使用的代码,通常需要源代码+头文件(调用DLL中的代码可以根据头文件进行)。在运行时,操作系统的动态链接器(如Windows中的DLL或Linux中的.so文件)会将库加载到内存中,并将其与目标程序共享。在编译目标程序时,链接器会在可执行文件中包含对动态链接库的引用,但不会将库的代码复制到可执行文件中。原创 2024-06-01 10:25:33 · 845 阅读 · 0 评论 -
C++: 异常
转载自公众号:风铃secC++ 异常处理机制是一种用于处理程序运行过程中出现异常情况的技术;异常是指程序在运行过程中发生的不正常情况,如除零错误、访问无效内存、文件不存在等。异常处理机制允许程序在发生异常时执行特定的操作,以便使程序更加健壮和可靠。原创 2024-06-01 10:20:59 · 285 阅读 · 0 评论 -
一文带你搞懂gdb调试C++以及调试多线程
当一个程序的多个线程获取多个互斥锁资源的时候,就有可能发生死锁问题,比如线程A先获取了锁1,线程B获取了锁2,进而线程A还需要获取锁2才能继续执行,但是由于锁2被线程B持有还没有释放,线程A为了等待锁2资源就阻塞了;例如需要在程序的第十八行增加一个断点,可以输入下面的命令。多线程问题往往不会出现在编译阶段,而是在运行阶段出现无法预计的错误,所以必须需要熟练使用gdb调试工具,找到出bug的位置,以及bug信息,并且改正,以下使用一个多线程中的出现的死锁问题并利用gdb调试工具进行调试解决bug。原创 2024-05-22 23:05:51 · 1374 阅读 · 0 评论 -
剖析并实现C++17新特性的Any类型
首先,Any类型接收一个任意类型的参数,也就是对其构造函数,模板化,同时拥有了一个成员指针,它是一个统一的指针,也就是接下来我会将它设计会基类的指针,以后会指向继承于它的派生类对象,注意我使用的是unique_ptr,所以手动声明了右值引用的拷贝和赋值,而删除了左值引用的拷贝和赋值(原因自查unique_ptr)也就是在下面,我继续实现了继承的关系方法。简要来说,我需要一个统一类型接收所有类型,并且统一类型可以推断接收的所有类型它到底是什么类型。2:Any拥有可以一个统一的类型指向任意类型,即联想到继承。原创 2024-05-24 12:42:48 · 530 阅读 · 0 评论 -
详解C++的this指针
this是一个指向当前对象的指针,它可以在类的成员函数中使用。它是每个类的非静态成员函数的隐含参数;当你在类的成员函数中使用this时,它指向调用该函数的对象。this指针的主要作用是让类的成员函数能够访问对象的成员变量和其他成员函数。因为每个对象都有自己的成员变量,所以需要一种方法来确定成员函数是在哪个对象上调用的,这就是this指针的作用。原创 2024-05-19 22:21:56 · 779 阅读 · 1 评论 -
C++设计模式:简单工厂、工厂方法、抽象工厂
简单工厂模式不能遵守开放-封闭原则,工厂和抽象工厂模式可以简单工厂模式只有一个工厂类,工厂和抽象工厂有多个工厂类工厂模式创建的产品对象相对简单,抽象工厂模式创建的产品对象相对复杂工厂模式创建的对象对应的类不需要提供抽象类【这产品类组件中没有可变因素】抽象工厂模式创建的对象对应的类有抽象的基类【这个产品类组件中有可变因素。原创 2024-05-10 19:21:07 · 979 阅读 · 1 评论 -
C++11中的右值引用、智能指针、function、bind、lambda、多线程
通过在构造函数中分配动态内存,并将字符串的副本存储在堆上,可以确保字符串的生存期与对象的生存期相匹配。同时,使用 和 确保了对内存的正确管理,避免了内存泄漏。究其原因是指针变量,不能浅拷贝,否则会出现当对象销毁时,指针指向的是一个无效的内存地址,这可能导致程序崩溃或者未定义的行为。或者出现内存重复释放的可能const左值引用 = 右值引用,所以为什么很多带左值引用的参数都加了const,右值不能带const,右值引用变量是左值,数组(指针,原因见上)都是通过new弄的,字符数组需要new len + 1原创 2024-05-10 18:15:33 · 1512 阅读 · 0 评论 -
C++的构造方法以及三条优化规则
函数参数传递过程中,对象优先按引用传递函数返回对象的时候,优先返回临时对象,而不是一个已经被定义过的对象接收返回值是对象的函数调用时,优先按初始化的方式接收,不要按赋值的方式也就是不要让已经定义过的对象接收。原创 2024-05-07 16:24:12 · 290 阅读 · 0 评论 -
数组指针、指针数组和二维数组
这种为数组指针,指向整个数组a的地址:p为数组地址, * p表示数组a本身,一般用数组的首元素地址来标识一个数组,当* p为数组首元素地址时,* * p表示首元素的值1,(*p)[1] 很好理解,就是2, 但不等于 * p[1]p:数组首地址,*p:第一个元素,p[2]:第三个元素, 不能 ( *p )[1],因为解引用就为int型了,是普通指针指向整型数据,好理解,比较类似于new出来的。*p:表示数组本身,由首位元素地址表示 **p:首元素。原创 2024-05-06 20:39:03 · 201 阅读 · 0 评论