自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(457)
  • 资源 (1)
  • 收藏
  • 关注

原创 二进制人工智能 博客精选

机器学习的数学基础机器学习PytorchPython信号与系统图像处理与计算机视觉OpenCV C++ Python

2022-06-04 19:09:16 2532 1

原创 【数据结构与算法】LeetCode: 贪心算法

从头遍历字符,并更新已遍历字符的最远出现下标,如果找到最远出现位置下标和当前下标相等了,则找到了分割点。到达最后一个下标的最小跳跃次数。统计每一个字符最后出现的位置。能否到达最后一个下标。

2024-10-30 11:10:16 354

原创 【C++网络编程】(五)IO多路复用:poll,epoll

时,如果当前没有任何监控的文件描述符处于就绪状态,进程会被挂起(进入休眠状态)并加入内核的阻塞链表,这是为了避免浪费 CPU 资源。当某个文件描述符的事件发生时,内核会检查阻塞链表,将那些因为等待该事件而阻塞的进程从链表中移除,并将它们唤醒,进程接着可以处理就绪的文件描述符。然而,如果在 ET 模式下未能处理完所有就绪的文件描述符,后续这些文件描述符将不会被再次通知,可能导致数据丢失。,默认值一般为 1024。仅在状态发生变化时返回文件描述符,例如,从不可写变为可写,或从不可读变为可读,或有新数据到来。

2024-10-15 15:06:19 1033

原创 【C++网络编程】(四)IO多路复用:select

此外,CPU在进行线程之间的上下文切换时也会有一定的开销,这进一步增加了系统的负担。在Linux系统中,一切皆文件,每个客户端连接都是以一个文件描述符(File Descriptor,FD)表示。复用指的是允许同一个线程处理多个IO操作,避免了为每个IO操作创建独立线程,从而实现了资源的复用。此外,使用非阻塞套接字避免了阻塞带来的问题,但会导致 CPU 占用高、编程复杂度增加、错误处理变得更复杂,以及可能出现数据传输不完整的情况。调用 select 时,将这个位图传递给内核,以判断哪些文件描述符是就绪的。

2024-10-12 11:50:57 551

原创 【C++网络编程】(三)多线程TCP服务端程序

主线程负责监听和连接多个客户端,子线程负责和对应的客户端进行通信(完成数据的接收和发送)。

2024-10-11 15:42:28 503

原创 【C++网络编程】(二)Linux平台下UDP客户/服务端程序

使用到的函数和宏除了的recvfromsendto和SOCK_DGRAM,其他使用到的函数和宏与TCP网络通信中的基本一致。:用于接收数据报文,适用于无连接的套接字(如 UDP)。它允许从任何源地址接收数据。成功时返回接收到的字节数,失败时返回-1。sockfd:接收数据的套接字描述符。buf:指向接收数据的缓冲区。len:缓冲区的长度,表示最大接收字节数。flags:接收选项的标志,通常为0。src_addr:指向sockaddr结构体的指针,用于存储发送方的地址信息。addrlen:指向。

2024-10-10 15:03:57 583

原创 【C++网络编程】(一)Linux平台下TCP客户/服务端程序

cstdlib>:提供了一些常用的标准库函数,源自 C 的stdlib.h,这些函数与程序控制、内存分配、随机数生成等功能相关。:终止程序执行,status用来返回退出状态码,0表示正常退出,非0表示异常退出。无返回值,直接终止程序。:是对 C 语言string.h的封装,提供了用于操作 C 风格字符串(以'\0'结尾的字符数组)和内存操作的函数。:将指定内存区域的前num个字节设置为value。返回指向ptr的指针,即被修改的内存区域的起始地址。:将格式化数据写入buffer。

2024-10-09 20:55:05 1220

原创 【C++设计模式】行为型模式:中介者模式

中介者模式通过引入一个中介者对象来集中控制对象之间的交互。这样可以解耦多个对象之间的复杂交互关系,使系统更易于维护和扩展。假设我们有一个简单的聊天室应用,其中有每个用户可以发送群聊消息给其他用户,我们可以使用中介者模式来实现用户之间的消息传递。

2024-10-08 14:14:56 444

原创 【C++设计模式】行为型模式:观察者模式

观察者模式定义了一种一对多的依赖关系:它让一个主题(被观察者)对象关联多个观察者对象,并且当主题对象的状态发生变化时,它会主动通知这些观察者对象,使它们能够自动更新自己或执行相应的响应操作。以一个设备的温度显示系统为例,在这个示例中,温度检测仪是被观察者,当设备温度发生变化时,它会通知所有的显示器更新温度信息。

2024-10-08 11:50:49 505

原创 【C++设计模式】结构型模式:桥接模式

在没有使用桥接模式的情况下,每种形状和颜色组合都需要一个独立的类,随着形状和颜色的增加,类的数量会迅速膨胀。通过桥接模式,你只需为形状和颜色分别定义类,这大大减少了需要实现的类的数量。桥接模式的动机是将“高层次的接口或类”与“低层次的接口或类”分离 (…颜色,形状比颜色高一层),使得系统具有更好的灵活性和可扩展性。假设你有一个绘图程序,需要支持绘制多种颜色的多种形状。个颜色结合在一起,会导致类的数量急剧增加(

2024-10-07 14:47:24 667

原创 【C++设计模式】结构型模式:适配器模式

适配器模式的动机确实是解决两个已有接口之间不兼容的问题,通过引入一个适配器类,将不兼容的接口进行转换,使它们能够协同工作,而无需修改已有的代码(通常是旧接口的代码),从而复用旧接口的功能,使其适应新接口的需求。假设我们有一个音频播放系统,需要支持多种音频格式,但旧的播放器只支持MP3格式。假设你有一个日志记录系统,旧的日志记录类只支持输出到控制台,而新的系统希望将日志记录到文件中。是的,你的说法是准确的,并且清晰地表达了适配器模式的核心概念。,它提供了一个不兼容的接口,而现在有一个新的接口。

2024-10-07 11:04:08 703

原创 【数据结构与算法】LeetCode:图论

【代码】【数据结构与算法】LeetCode:图论。

2024-10-05 10:39:02 582

原创 【数据结构与算法】LeetCode:堆和快排

三向切分快速排序在处理包含大量重复元素的数组时比双向切分快速排序更快。

2024-10-03 22:31:39 363

原创 【数据结构与算法】LeetCode:二叉树

前序遍历(Pre-order Traversal)、中序遍历(In-order Traversal)、后序遍历(Post-order Traversal)和层序遍历(Level-order Traversal)是四种常见的遍历树形结构的方法。首先访问根节点,然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然遵循前序遍历的规则。首先遍历左子树,然后访问根节点,最后遍历右子树。首先遍历左子树,然后遍历右子树,最后访问根节点。在遍历左、右子树时,仍然遵循后序遍历的规则。通常使用递归或栈迭代来实现。

2024-10-03 15:44:46 917

原创 【C++设计模式】(四)创建型模式:简单工厂模式,工厂方法模式,抽象工厂模式

工厂模式的动机在于通过一个专门的工厂类来封装对象的创建过程,以解耦对象的使用和创建,隐藏复杂的对象实例化逻辑,从而提高代码的灵活性和可维护性。抽象工厂模式的主要是为了解决在不需要指定具体类的情况下,创建一组相关或依赖对象 (产品族)的需求。它通过提供一个接口来创建一系列相关或依赖对象的工厂,使得客户端可以在不指定具体实现类的情况下,创建产品族中的产品。工厂方法模式能在不修改已有代码的情况下,通过增加新的工厂类来创建新的产品类型,实现对开闭原则的遵循。来声明创建产品对象的接口,具体的产品创建由具体工厂类(

2024-09-29 14:14:31 666

原创 【数据结构与算法】LeetCode:栈

【代码】【数据结构与算法】LeetCode:栈。

2024-09-23 16:12:17 196

原创 【数据结构与算法】LeetCode:二分查找

在排序数组中查找元素的第一个和最后一个位置public:// 二分查找变形ans = mid;// 找到目标值时,继续在左半部分查找} else {return ans;// 调用binarySearch函数,查找目标值的第一个位置// 查找目标值的最后一个位置last_pos--;

2024-09-23 00:02:33 430

原创 【数据结构与算法】LeetCode:哈希表

【代码】【数据结构与算法】LeetCode:哈希表。

2024-09-22 00:09:47 586

原创 【数据结构与算法】LeetCode:双指针法

滑动窗口通过双指针实现,一个指针(右指针)用于扩展窗口,另一个指针(左指针)收缩窗口。与普通的双指针不同的是,滑动窗口法的计算过程一般涉及双指针之间的值,而不仅仅是两个指针指向的值。双指针法通常是指使用两个指针相向而行或同向而行来遍历对象(如数组、链表或字符串),以避免多层循环,从而降低算法的时间复杂度。

2024-09-20 22:25:06 994

原创 【C++设计模式】(三)创建型模式:单例模式

在某些情况下,某些代码组件(如线程池,日志记录器)需要在整个应用程序中共享,使用单例模式可以实现组件资源的复用,并简化系统设计。在懒汉式单例模式中,单例的实例是在首次被需要时才被创建。这种方式的好处在于它可以延迟实例的创建,从而减少程序启动时的资源消耗和初始化时间。在饿汉式单例模式中,单例的实例在程序启动时就立即创建。在多线程环境下,饿汉式是线程安全的,因为实例在类加载时就已经创建好了,不存在并发访问创建实例的问题。懒汉式是指在第一次使用时才会创建单例实例,实例的创建被延迟到第一次使用。

2024-09-01 22:25:19 975

原创 【C++并发编程】(十三)递归锁

递归锁允许同一线程多次锁定同一个锁,而不会导致死锁。每次加锁操作会增加锁的计数器,但不会阻塞线程;每次解锁操作会减少计数器,当计数器为零时释放锁。与互斥锁一样,递归锁同样可以使用锁管理器,例如。,进行生命周期的自动管理。

2024-07-19 15:43:42 481

原创 【C++并发编程】(十二)自旋锁

在多线程并发的环境中,线程的阻塞和唤醒通常需要涉及操作系统的调度器,进行线程上下文的切换。自旋锁通过忙等待的方式,避免了线程阻塞和系统调度器介入,从而减少了这部分开销。但也需要注意,自旋锁适用于临界区较小且短时间内能够获取锁的情况。如果临界区较大,自旋锁会导致线程长时间占用CPU资源,反而降低系统的整体性能。与传统的互斥锁相同,自旋锁也是一种用于保护共享资源的同步机制,不同都是,自旋锁在尝试获取锁时不会立即进入阻塞状态,而是循环检查锁的状态(自旋),“忙等”直到获取到锁为止。只有两种状态:被设置(

2024-07-17 22:17:09 490

原创 【C++并发编程】(十一)读写锁

读写锁是一种同步机制,它允许多个线程同时以共享模式(读模式)访问共享资源,从而提高了并发读取的效率;然而,在任何一个线程需要独占访问(写模式)以修改共享资源时,它将阻止其他所有线程(无论是读模式还是写模式)访问该资源,以确保数据的一致性和完整性。

2024-07-16 16:37:49 425

原创 【C++并发编程】(十)生产者-消费者模型

生产者-消费者模型是一种经典的并发编程模型,旨在解决多线程环境中负责生成数据或任务的线程(生产者)与负责处理数据或任务的线程(消费者)之间的协作与数据共享问题。:用于存放由生产者生产,被消费者处理的数据或任务。这个缓冲区通常是一个队列。:用于确保生产者和消费者线程之间的有效协调和数据安全共享。

2024-07-08 22:18:12 398

原创 【C++】Google Test(gtest)单元测试

测试夹具(Test Fixture)用于提供一个环境,允许开发者在多个测试用例之间共享设置和清理的代码,确保每个测试用例都在相同或可控的初始状态下运行。是一种软件测试方法,它旨在将应用程序的各个部分(通常是方法或函数)分离出来并独立测试,以确保每个部分都能够按预期工作。为测试用例的名称,用于将相关的测试分组在一起,以便在测试结果中更容易地识别和归类。味前缀的致命断言,其在测试失败时程序立即终止。为前缀的非致命断言,其在测试失败时程序会继续执行;为具体测试的名称,一般描述测试的目的。方法中,初始化了一个。

2024-07-06 19:44:12 2820 2

原创 【C++设计模式】(二)设计模式简介

亚历山大提出了一系列在建筑设计中常见的、能够解决特定问题的模式,这些模式可以在不同的建筑设计中重复使用。:包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。这些设计模式关注的是对象之间的交互和职责分配,通过解决对象间职责分配和通信问题来应对需求变化对多个交互对象带来的影响。:包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。:包括单例模式、工厂方法模式、抽象工厂模式、生成器模式、原型模式。

2024-07-05 22:26:44 629

原创 【C++设计模式】(一)面向对象编程的八大原则

面向对象编程有一系列的设计准则来保证软件的质量,包括:单一职责原则,开放-关闭原则,里氏替换原则,接口隔离原则,依赖倒置原则,迪米特法则/ 最少知识原则,合成复用原则,针对接口编程而不是针对实现编程原则。接口,然后让战士、法师、盗贼等角色类都实现这个接口,那么我们就可以在不修改已有代码的情况下,通过添加新的角色类或者修改接口的实现来扩展或修改游戏的行为。例如,USB接口能够连接不同类型的设备(如打印机、键盘、鼠标),这些设备通过共同的接口(USB接口)与电脑通信,而不需要知道每个设备的具体实现细节。

2024-07-04 19:32:36 1223

原创 【C++并发编程】(九)线程池

在这个表达式中, 工作线程在无限循环中等待新任务: 每个工作线程在等待时,会尝试获取任务队列的互斥锁。一旦有任务添加到任务队列中,或者接收到停止信号,线程会被唤醒,并执行后续的指令。它的基本概念是将一组预先创建的线程放入一个池中,需要执行任务时,从池中获取空闲线程来处理任务,任务完成后,线程不会被销毁,而是返回池中等待下一个任务。当线程池中的工作线程空闲时,它们会从任务队列中取出任务并执行。线程池在初始化时创建一定数量的工作线程,并在销毁时确保所有工作线程都正确结束。:工作线程负责执行分配给线程池的任务。

2024-06-27 16:33:35 559

原创 【C++并发编程】(八)信号量

信号量的计数值是一个非负整数,表示可用资源的数量。如果信号量的计数值为0,则线程或进程将被阻塞,直到信号量的计数值大于0。为了有效管理这些预订,店主可以采用类似于计数信号量的系统来确保桌子的合理分配和预订管理。二值信号量只有两个状态(0 和 1),类似于互斥锁,主要用于控制单个资源的访问。信号量可以用于线程间的同步,使得某些操作按特定顺序执行,从而避免竞态条件的发生,也可以限制对共享资源的并发访问数量,以防止资源过载。创建,并指定其最大计数值(桌子数量)和初始计数值(空闲的桌子数量)。

2024-06-25 10:11:01 1407

原创 【C++面向对象编程】(二)this指针和静态成员

当我们创建一个类的多个对象时,这些对象的成员函数的代码是共享的,也就是说,无论我们创建多少个类的对象,这些函数的代码都只有一份。为了在这些共享的成员函数内部引用和修改特定对象的成员变量,C++提供了。类的静态成员(包括静态成员变量和静态成员函数)在所有类的对象之间是共享的,只存在于一个数据存储区域。类的非静态成员(包括成员变量和成员函数)是类的每个对象所独有的。指针传递自己的地址给该函数,以便函数能够访问和修改该对象的成员变量。指针是一个隐式的指针,它指向调用非静态成员函数的对象。使用C++17新增的。

2024-06-07 20:57:19 1079

原创 【C++面向对象编程】(一)类,对象和四大机制(封装,继承, 多态 ,抽象)

当我们说“我的朋友叫张三”时,“张三”就是一个对象,他是根据“人类”这个类制造出来的具体实例。张三可能有他自己的名字、肤色、年龄等独特的属性,并且他的说话风格,走路姿势,思考方式等也会与其他人不同。对象:每一个对象都是根据类创建的具有其属性和方法的实例,并且具有唯一的身份标识(如内存地址)和自己独特的属性值。成员变量是类中的变量,用于存储与类相关的数据。封装隐藏了对象的内部实现细节,只暴露必要的接口,提高了代码的可维护性和安全性。换句话说,类的成员包括变量(也称为类的属性)和函数(也称为类的方法)。

2024-05-30 16:03:42 847

原创 【C++】GNU Debugger (GDB) 使用示例

如果使用CMake编译你的C++项目,并希望包含调试信息以便使用GDB进行调试,你需要在CMakeLists.txt文件中指定构建类型为Debug。GDB(GNU Debugger)是一种Unix下的程序调试工具,用于调试C、C++等编程语言编写的程序。中,编写一个简单的C++程序,该程序包含一个错误的函数。在项目的根目录下,创建一个构建目录并运行CMake。现在,我们已经构建了程序,可以使用GDB进行调试。首先,我们创建一个目录,并在其中创建必要的文件。函数中的错误,然后重新构建并再次调试。

2024-05-08 14:36:44 1251

原创 【C++泛型编程】(二)标准模板库 STL

C++ 的标准模板库(Standard Template Library,STL)旨在通过模板化的设计,提供一种通用的编程模式,使程序员能方便地实现和扩展各种数据结构和算法,提高程序的开发效率和执行效率。仿函数/函数对象是一个行为类似于函数的对象,可以被调用,并且可以在泛型编程中用作函数参数,用于定义算法的行为策略 (允许我们为算法提供自定义的比较、判断或操作规则)。关联式容器内部通常使用红黑树(对于有序的容器)或哈希表(对于无序的容器)来实现,以支持高效的查找、插入和删除操作。

2024-05-07 20:58:09 1124

原创 【C++泛型编程】(一)函数模板和类模板

C++泛型编程(Generic Programming)是一种编程范式,它允许程序员编写与参数无关的代码,也就是说这些代码可以在多种数据类型上重用,而无需为每个类型重新编写。函数模板允许程序员编写一个通用的函数,该函数可以接受不同类型的参数,并在编译时根据提供的参数类型生成特定的函数版本。类模板则允许你编写一个通用的类,该类可以在编译时根据提供的类型参数生成特定的类版本。全特化:全特化是指对模板的所有模板参数都进行特化处理。在使用类模板时,需要为模板参数指定具体的类型。这样的具体类型提供特定的实现。

2024-05-07 10:40:02 357

原创 【C++并发编程】(七)异步编程

在这个示例中,异步任务(计算5的平方)需要2秒钟来完成。异步编程(Asynchronous Programming)是一种编程模型,它允许程序在等待某个操作(如I/O操作、网络请求等)完成时,不阻塞当前线程的执行。在并发编程中,可以使用异步编程来避免线程阻塞,提高资源的利用率。这个函数接受一个可调用的对象(如函数、Lambda 表达式、函数对象等)作为参数,并在一个单独的线程(或可能是线程池中的线程,具体取决于实现)上异步执行它。,这时如果异步任务还没有完成,主线程将会被阻塞,直到结果可用。

2024-05-06 15:57:15 326

原创 【C++并发编程】(六)死锁问题

死锁(Deadlock)是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(或线程)称为死锁进程(或线程)。为了解决上述代码中的死锁问题,我们可以使用一种称为“锁顺序”或“锁排序”的策略,即确保所有线程都以相同的顺序请求锁。函数会尝试以原子方式锁定多个互斥锁,如果无法立即获得所有锁,它会阻塞直到所有锁都变得可用,或者抛出异常(取决于。来协调多个锁的锁定顺序了。

2024-05-06 09:17:50 511

原创 【C++并发编程】(五)原子操作

在多线程环境中,由于处理器缓存、指令重排和编译器优化等因素,内存访问的顺序可能并不总是按照代码中的顺序执行。原子操作通常比互斥锁具有更高的性能,但原子操作通常针对单个数据项(如一个整数或指针)进行,它们确保了对该数据项的访问是原子的,即不会被其他线程打断。原子操作是不可中断的操作,一旦开始,就必须完全执行完毕,不受其他线程干扰,可以确保多个线程在访问和修改共享数据时不会发生冲突,从而避免了数据竞争和相关的并发问题。类型提供了一系列操作保证了操作的原子性,即操作在执行过程中不会被其他线程打断。

2024-05-05 14:07:58 807

原创 【C++并发编程】(四)条件变量

条件变量(Condition Variable)用于线程间的同步,允许一个或多个线程在特定条件不满足时等待,并在条件满足时被其他线程唤醒。: 唤醒在该条件变量上等待的一个线程(如果有的话)。如果没有线程在等待,那么这个调用就没有效果。在这个例子中,我们创建了5个线程,每个线程都试图打印其ID。时,所有等待的线程都会被唤醒,并重新尝试获取互斥锁以继续执行。函数时,都会唤醒一个等待的线程来处理任务。因此,在需要使用条件变量(: 等待直到另一个线程调用该条件变量的。: 唤醒在该条件变量上等待的所有线程。

2024-05-04 15:24:35 463

原创 【C++并发编程】(三)互斥锁:std::mutex

当一个任务(或线程)持有互斥锁,且该互斥锁处于闭锁状态,那么这个任务可以执行访问共享资源的代码,其他任务(或线程)则不被允许。开锁后,该线程将失去了对互斥锁的所有权,其他正在等待的线程现在有机会获取这个互斥锁,以访问共享资源。如果互斥量当前没有被其他线程锁定(即它是可用的),则调用线程会成功获取锁,并继续执行其后续代码。如果互斥量已经被其他线程锁定,则调用线程会被阻塞(即它会停止执行,直到锁变得可用)。一旦线程获取了锁,它就可以安全地访问共享资源,而不必担心其他线程同时修改它。进行互斥锁的闭锁和开锁。

2024-05-04 13:04:03 930

原创 【C++并发编程】(二)线程的创建、分离和连接

在C++中,线程的分离(detach)和连接(join)是用于管理线程生命周期的两种主要方式。当创建一个线程时,你可以选择让它独立运行(即分离),或者等待它完成执行(即连接)。方法时,你告诉线程库你不再关心这个线程的结束时间,并且你不需要获取它的返回值。线程将在后台独立运行,直到其函数返回,结束。当你想在线程中执行某个有参数或无参数的函数时,你可以将该函数传递给。方法时,你告诉线程库你想要等待这个线程完成执行后再继续下去。你还可以传递类的成员函数和类的实例给线程。的线程将被阻塞,直到被连接的线程执行完毕。

2024-05-03 23:17:05 977

基于法线差的点云分割 数据

基于法线差的点云分割 数据

2024-03-09

基于法线差的点云分割 数据样例

基于法线差的点云分割 数据样例

2024-03-09

PCL(十八)从距离图像中提取点云的边界 数据

PCL(十八)从距离图像中提取点云的边界 数据

2024-03-05

PCL (十七)距离图可视化 点云数据

PCL (十七)距离图可视化 点云数据

2024-03-04

实例讲解Dataset 和 DataLoader的 zoro数据集

【pytorch】(二)实例讲解Dataset 和 DataLoader 用到的数据

2022-01-22

空空如也

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

TA关注的人

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