- 博客(197)
- 收藏
- 关注
原创 C++无锁队列
无锁队列(Lock-Free Queue)是一种在多线程环境下实现的队列数据结构,它不依赖传统的锁机制(如互斥锁 std::mutex)来保证线程安全。而是通过原子操作(如 std::atomic 提供的操作)和内存屏障来确保多个线程可以同时对队列进行入队(enqueue)和出队(dequeue)操作,且不会出现数据竞争和不一致的问题。
2025-03-10 01:28:47
1085
原创 手写图-邻接表
下面是一个完整的C++实现手写邻接表表示图的代码。邻接表是一种常见的图的表示方法,其中每个顶点维护一个链表,链表中存储与该顶点直接相连的其他顶点。
2025-02-11 03:05:14
304
原创 手写图-邻接矩阵
下面是一个完整的C++实现手写邻接矩阵表示图的代码。邻接矩阵是一种常见的图的表示方法,其中矩阵的行和列分别代表图中的顶点,矩阵中的值表示顶点之间是否存在边。
2025-02-11 03:01:39
168
原创 手写平衡二叉树 (AVL树)
下面是一个完整的C++实现手写平衡二叉树(AVL树)的代码。AVL树是一种自平衡二叉搜索树,其中每个节点的左右子树高度差不超过1。
2025-02-11 02:53:29
204
原创 手写二叉搜索树 (BST)
下面是一个完整的C++实现手写二叉搜索树(BST)的代码。二叉搜索树是一种二叉树,其中每个节点的左子树包含的值小于该节点的值,右子树包含的值大于该节点的值。
2025-02-11 02:47:52
168
原创 C++11新特性之线程async
强制在新线程中异步执行。延迟执行,直到调用 get 或 wait。由实现决定是否创建新线程或延迟执行。要执行的函数。函数的参数。std::async是更高层次上的异步操作,它的存在可以使开发者不用关注线程创建内部细节,就能方便的获取异步执行状态和结果,还可以指定线程创建策略,应该用std::async替代线程的创建,让它成为做异步操作的首选。使线程的创建变得非常简单,还可以获取线程id等信息。std::mutex。
2024-12-14 02:36:37
1223
原创 C++11新特性之线程std::future
std::future 是 C++11 引入的标准库中的一种模板类,用于实现线程间的异步操作结果的获取。它是标准库 中的一部分,配合 std::async、std::promise 等工具使用。
2024-12-13 01:32:41
880
原创 C++11新特性之线程condition_variable
std::condition_variable 是 C++ 标准库中的同步机制,用于线程间的通信和协作,主要用来让一个线程等待某个条件发生(通常是由其他线程通知)。它是基于信号量的高级封装,配合互斥锁(std::mutex)和条件标志(通常是布尔值或其他标志变量)一起使用。
2024-12-13 01:15:35
366
原创 C++11新特性之线程volatile
volatile关键字用于声明一个变量可能被外部事件(如硬件中断、另一个线程等)修改。通常用于嵌入式编程和多线程编程中。
2024-12-13 00:45:23
251
原创 C++11新特性之线程std::call_once
std::call_once 是 C++11 标准引入的一种工具,用于确保某段代码只被执行一次,通常用于实现线程安全的单例模式或初始化操作。它结合了 std::once_flag 使用。
2024-12-11 01:40:27
382
原创 C++11新特性之线程std::lock
std::lock 是 C++ 标准库中的一个工具函数,用于同时锁定多个锁对象(通常是 std::mutex 或 std::unique_lock),以避免死锁问题。std::lock 位于头文件 中,定义如下:功能它采用了一种算法(如 层次锁排序算法),确保在锁定多个互斥量时不会发生死锁。该函数会尝试锁定提供的所有锁对象(以 不可中断的方式),直到全部成功。支持任意数量的锁,至少需要两个。std::lock参考代码以下是一个完整的代码示例,展示如何使用 std::lock 来同时锁定两个
2024-12-10 00:53:01
392
原创 C++11新特性之线程std::mutex
std::mutex 是 C++ 标准库提供的一种用于多线程编程的互斥量(mutex)。它定义在头文件 中,主要用于保护共享数据,防止多个线程同时访问而引发数据竞争。
2024-12-10 00:17:40
1172
原创 C++11新特性之线程std::thread
是C++11引入的标准库类,用于创建和管理线程。通过std::thread,程序可以并发执行多个任务,从而提高效率。
2024-12-09 23:57:36
1066
原创 C++ 列表初始化initializer_list
列表初始化是用花括号 {} 提供初始值来初始化变量或对象。初始化简单变量初始化结构体或类初始化标准容器(如std::vector、std::array等)统一初始化方式,取代传统的构造函数或等号赋值。
2024-12-09 01:37:21
495
原创 C++返回值优化
C++中的返回值优化(Return Value Optimization, RVO)是编译器为了提高代码运行效率而进行的一种优化技术。RVO允许编译器将临时对象的构造过程优化为直接返回该对象,而不是拷贝或移动。通过这种方式,可以减少对象的拷贝开销,从而提高程序性能。
2024-12-09 01:02:23
360
原创 C++移动语义move
1移动语义的核心是利用右值引用(T&&)和标准库中的std::move,使对象的资源从一个对象转移到另一个对象,而不是拷贝,从而提高程序性能。减少临时对象的开销(如函数返回大对象)。避免深拷贝(如容器中的数据转移)。使用右值引用(T&&)定义移动构造函数和移动赋值运算符。移动语义可以避免冗余的深拷贝操作,提高程序效率。使用std::move显式启用移动语义。
2024-12-08 23:34:18
702
原创 C++完美转发和左值右值
这段代码主要演示了C++中值类别(左值和右值)的处理,以及std::forward和std::move在模板编程中的用法。通过PrintV函数,代码分别打印参数是左值还是右值。std::forward 用于在模板中精确传递值类别(左值或右值)。std::move 用于将变量强制转换为右值。在模板中处理值类别时,需要小心参数传递方式,确保符合预期的行为。
2024-12-08 22:20:00
811
原创 C++ 左值引用和右值引用的区别和联系
在这个例子中,str是一个左值,printLvalue函数接受一个左值引用参数lvalueRef,并打印出字符串内容。在这个例子中,std::move(str)将str转换为右值引用,并传递给printRvalue函数。注意,std::move并不移动数据,它只是将左值转换为右值引用,从而允许函数使用移动语义(如果函数支持的话)。直接传递字符串字面量"Temporary string"也是右值引用的一种情况。
2024-12-08 11:50:24
286
原创 C++11右值引用
下面是一个关于 C++11 右值引用(Rvalue References)的完整示例代码,涵盖了右值引用的基本概念、std::move、以及如何使用右值引用实现移动语义。移动构造函数:将资源(内存、数据)从临时对象转移到新对象中,并将临时对象的数据指针置空。使用 std::move 将一个右值对象的资源转移到当前对象,并释放当前对象的资源。std::move 并不真正移动对象,它只是将左值转化为右值引用,从而启用移动语义。默认构造函数:分配内存并初始化。带参数构造函数:给对象赋初值。释放动态分配的内存。
2024-12-08 02:16:21
190
原创 Linux 进程间通信
进程间通信(IPC,Inter-Process Communication)在 Linux 下常用的方法包括:1)管道(Pipe)2)有名管道(FIFO)3)消息队列(Message Queue)4)共享内存(Shared Memory)5)信号量(Semaphore)6)套接字(Socket)
2024-12-08 01:02:02
354
原创 Java线程池
创建和销毁线程非常损耗性能。通过创建线程池,可以复用创建好的线程。线程的创建需要开辟虚拟机栈、本地方法栈、程序计数器等线程私有的内存空间,在线程销毁时需要回收这些系统资源,频繁地创建销毁线程会浪费大量资源,而通过复用已有线程可以更好地管理和协调线程的工作。二、 线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等。一、 当执行大量异步任务时线程池能够提供很好的性能。
2024-08-20 20:12:37
218
原创 求最大的公共字符串
写一个C++的函数,输入两个字符串,输出其中的长度最大的公共字符串(若有多个,取最后一个)。例如输入"ababcdef",“abxyzabck”, 输出"abc"
2023-05-31 22:40:27
370
原创 手写vector
在这个代码中,实现了以下操作:push_back:将新元素添加到向量的末尾。pop_back:从向量的末尾删除最后一个元素。操作符[]:允许通过索引访问元素。getSize:返回向量中元素的数量。getCapacity:返回向量分配的内部数组的大小。析构函数:释放内存。
2023-05-26 01:47:50
917
原创 手写平衡二叉树
在这个实现中,Node 类表示二叉平衡树的节点。每个节点包含一个 key 值,一个指向左子树的指针 left,一个指向右子树的指针 right,以及一个表示该节点的高度 height。max 函数返回两个数中的最大值,height 函数返回给定节点的高度。newNode 函数创建一个新的具有给定 key 值的节点,并将其左右子树和高度初始化为 NULL。该程序实现了二叉平衡树的插入和中序遍历操作。在每次插入节点时,都会检查当前子树是否平衡,并进行相应的旋转操作以维持平衡。
2023-05-26 01:02:46
162
原创 手写单链表
这里我们定义了一个 Node 结构体来表示链表的节点,其中包含了一个 data 成员变量表示节点的数据,以及一个 next 指针成员变量表示下一个节点的地址。在上面的代码中,我们实现了以下三个基本操作:insertAtHead:在链表头部插入一个节点;insertAtTail:在链表尾部插入一个节点;deleteNode:删除链表中指定值的节点。其中,插入操作需要创建一个新的节点,并将其加入到链表中,而删除操作则需要找到要删除的节点,并修改其前一个节点的 next 指针。
2023-05-25 22:39:04
1290
原创 手写队列queue
这里我们使用了循环数组来实现队列,利用取模运算可以使队列的循环利用。在入队操作时,如果队列已满则输出错误信息;在出队操作和获取队首元素时,如果队列为空则同样输出错误信息。
2023-05-25 21:52:53
246
原创 手写栈stack
模板数据类型实现栈以下是一个基于C++的手写栈的示例代码,包括了栈的初始化、入栈、出栈、获取栈顶元素和判断栈是否为空等常用功能。以上示例代码中,我们使用了一个vector来存储栈中的元素。栈的入栈和出栈操作分别使用了vector的push_back和pop_back方法。获取栈顶元素和判断栈是否为空的操作也很简单,直接使用vector的back和empty方法即可。
2023-05-25 21:40:02
387
原创 C++11智能指针weak_ptr解决shared_ptr循环引用问题
【代码】C++11智能指针weak_ptr解决shared_ptr循环引用问题。
2023-05-16 00:45:41
193
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人