何综瑞
码龄2年
关注
提问 私信
  • 博客:95,500
    95,500
    总访问量
  • 177
    原创
  • 20,168
    排名
  • 2,820
    粉丝
  • 226
    铁粉
  • 学习成就

个人简介:记录一下C++日常学习中的知识

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:广东省
  • 目前就职: 品图锐光科技有限公司
  • 加入CSDN时间: 2022-07-21
博客简介:

m0_72877724的博客

查看详细资料
  • 原力等级
    成就
    当前等级
    5
    当前总分
    1,201
    当月
    18
个人成就
  • 获得1,763次点赞
  • 内容获得1次评论
  • 获得984次收藏
  • 代码片获得320次分享
创作历程
  • 177篇
    2024年
成就勋章
TA的专栏
  • C++多线程
    2篇
  • C++基础知识
    75篇
  • C++STL
    31篇
  • 基础算法
    17篇
  • C++智能指针
    5篇
  • 计算机组成原理
    1篇
  • 操作系统
    1篇
  • 数据结构
    3篇
  • 网络篇
    4篇
  • 基础设计模式理解
    24篇
  • 工作中的感悟心得
    1篇
  • C++中级知识
    1篇
兴趣领域 设置
  • 编程语言
    c++c语言
  • 开发工具
    visualstudio
  • 数据结构与算法
    算法数据结构线性回归
  • 区块链
    区块链智能合约信任链
创作活动更多

AI大模型如何赋能电商行业,引领变革?

如何使用AI技术实现购物推荐、会员分类、商品定价等方面的创新应用?如何运用AI技术提高电商平台的销售效率和用户体验呢?欢迎分享您的看法

186人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

C++11实现线程安全单例模式:从原理到实践

在这个优化版本中,我们将重点放在最推荐的两种方法上:使用 std::call_once 和局部静态变量。同时,我们会讨论一些额外的考虑点,以使单例模式更加健壮和易于使用。通过这些优化,我们创建了一个更加健壮、安全和易于使用的线程安全单例模式实现。这些实现充分利用了C++11的特性,提供了良好的性能和线程安全保证。使用 std::unique_ptr 替代原始指针:这样可以自动管理内存,防止内存泄漏。在 std::call_once 版本中使用 lambda 函数:使代码更加简洁。
原创
发布博客 2024.08.29 ·
356 阅读 ·
3 点赞 ·
0 评论 ·
2 收藏

C++进程和线程得区别

需要注意的是,线程的使用通常更加复杂,涉及到同步和互斥等问题,而进程间的通信则需要使用特定的IPC机制。在实际开发中,应根据具体需求选择合适的并发模型。这个例子展示了进程和线程的基本使用方法。实际上,线程通常用于在同一个程序中执行并发任务,而进程通常用于运行独立的程序。
原创
发布博客 2024.08.29 ·
306 阅读 ·
10 点赞 ·
0 评论 ·
2 收藏

揭秘C++中IO密集型应用的双队列线程池技术

通过结合就绪队列和阻塞队列的线程池设计,我们可以显著提高IO密集型应用的性能。在当今高并发的软件开发环境中,IO密集型应用的性能优化一直是一个重要且具有挑战性的话题。本文将深入探讨一种强大的技术:结合就绪队列和阻塞队列的线程池设计,这种设计能显著提升C++中IO密集型应用的性能和效率。当一个任务因IO操作而阻塞时,线程可以立即切换到就绪队列中的其他任务,避免CPU空闲。f) IO事件就绪时,将相关任务从阻塞队列移回就绪队列。a) 创建两个任务队列:就绪队列和阻塞队列。减少了线程频繁阻塞和唤醒的开销。
原创
发布博客 2024.08.10 ·
637 阅读 ·
13 点赞 ·
0 评论 ·
9 收藏

解密C++中的并发与并行:从概念到代码,打造高效多任务程序

理解并发和并行的区别对于设计高效的多任务程序至关重要。并发适合处理需要频繁I/O操作或等待的任务,而并行则更适合处理可以被分解为独立子任务的计算密集型问题。虽然它们看起来是同时运行的,但在单核系统上,它们实际上是交替执行的。通过合理利用C++提供的并发和并行工具,开发者可以充分发挥现代硬件的潜力,创造出更快、更高效的应用程序。并发是指系统处理多个任务的能力,这些任务看起来是同时进行的,但实际上可能是交替执行的。并行是指同时执行多个任务,通常在多核处理器或多台机器上实现。
原创
发布博客 2024.08.09 ·
360 阅读 ·
8 点赞 ·
0 评论 ·
3 收藏

深入剖析std::deque:揭秘其内部结构与性能平衡之术

std::deque(双端队列)是C++标准库中的一个容器,它允许我们在队列的两端快速插入和删除元素,同时还提供了随机访问的能力。std::deque的内部结构以及它是如何平衡随机访问和插入/删除性能的,是一个相当有趣且值得深入了解的话题。
原创
发布博客 2024.07.24 ·
443 阅读 ·
14 点赞 ·
0 评论 ·
1 收藏

深入解析 C++11 std::array:比 C 风格数组更安全、更高效的数组封装

std::array。
原创
发布博客 2024.07.24 ·
793 阅读 ·
6 点赞 ·
0 评论 ·
5 收藏

C++ STL容器适配器:掌握stack、queue和priority_queue,让你的代码更加优雅高效

在C++标准模板库(STL)中,容器适配器是一种特殊的容器,它们在现有容器的基础上提供了一套特定的接口,以实现特定的功能。今天,我们将深入探讨三种常用的容器适配器:stack、queue和priority_queue。这些工具不仅能让我们的代码更加简洁,还能大大提高处理特定问题的效率。
原创
发布博客 2024.07.23 ·
551 阅读 ·
8 点赞 ·
0 评论 ·
5 收藏

掌握LRU缓存:用C++和STL构建高效内存管理系统

LRU(Least Recently Used)缓存是一种常用的缓存淘汰算法,它在有限的缓存空间中保留最近使用过的数据,而淘汰最久未使用的数据。这个实现为读者提供了一个清晰、高效的LRU缓存示例,可以作为理解缓存算法和STL使用的良好起点。
原创
发布博客 2024.07.22 ·
393 阅读 ·
13 点赞 ·
0 评论 ·
1 收藏

C++17 string_view: 性能与便利的完美结合

std::string_view是C++17引入的一个新类,它为字符串操作提供了一种轻量级的、非拥有的只读视图。这个类的主要目的是提高字符串处理的性能,同时保持API的灵活性。使用std::string_view可以在不影响API灵活性的同时,显著提高字符串处理的性能。它特别适用于那些需要频繁传递和处理字符串,但不需要修改字符串内容的场景。
原创
发布博客 2024.07.22 ·
287 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏

C++11 emplace系列函数:性能提升的秘密武器

C++11引入的emplace系列函数(如emplace_back、emplace、emplace_hint等)为STL容器提供了一种更高效的元素插入方式。这些函数不仅可以提高代码的性能,还能让我们的代码更加简洁优雅。今天,我们将深入探讨emplace函数的优势,并通过实例来展示它们的强大之处。
原创
发布博客 2024.07.21 ·
966 阅读 ·
28 点赞 ·
0 评论 ·
5 收藏

巧用C++ STL:一行代码轻松去重Vector,效率提升10倍!

在C++编程中,我们经常需要处理包含重复元素的vector。今天,我们将探讨如何利用C++ STL(标准模板库)的强大功能,用简洁优雅的代码高效地删除vector中的重复元素。这个函数不会真正删除元素,而是将不重复的元素移到vector的前部,并返回一个迭代器,指向最后一个不重复元素之后的位置。这两个算法配合使用,可以轻松实现vector的去重。迭代器到vector末尾的所有元素,这些就是重复的元素。最后,我们得到了一个没有重复元素的vector。首先,我们创建一个包含重复元素的vector。
原创
发布博客 2024.07.21 ·
955 阅读 ·
18 点赞 ·
0 评论 ·
1 收藏

STL魔法:用priority_queue实现堆排序与vector去重的艺术

STL提供了强大的工具来实现复杂的算法,如堆排序和高效的向量去重。理解这些算法的工作原理和复杂度分析对于选择正确的方法和优化性能至关重要。堆排序是一种高效的比较排序算法,而priority_queue正是基于堆实现的。我们可以利用priority_queue的特性来简化堆排序的实现。我们将探讨最高效的方法,涉及到排序和unique算法的使用。总体时间复杂度:O(n log n)(主要是排序的复杂度),空间复杂度:O(1)(原地操作)。总体时间复杂度:O(n log n),空间复杂度:O(n)。
原创
发布博客 2024.07.20 ·
539 阅读 ·
8 点赞 ·
0 评论 ·
4 收藏

C++进阶:RAII魔法与STL容器的多线程探秘

通过适当的封装和同步机制,我们可以创建线程安全的容器,在保证数据一致性的同时,也能享受STL容器带来的便利。内存序:虽然这个例子中没有直接使用,但在更复杂的无锁编程中,理解内存序(memory order)是很重要的。中,每个操作都有自己的锁。在多线程环境中使用STL容器需要格外小心,因为大多数STL容器不是线程安全的。死锁风险:虽然这个简单的例子中不太可能发生,但在更复杂的场景中,使用互斥锁时需要注意避免死锁。这个原则确保了资源的生命周期与持有资源的对象的生命周期绑定在一起,从而避免了资源泄漏。
原创
发布博客 2024.07.20 ·
602 阅读 ·
19 点赞 ·
0 评论 ·
5 收藏

解锁C++ unordered_map的秘密:自定义类型作为键的艺术

通过正确实现相等比较和哈希函数,我们可以充分利用unordered_map的强大功能,将其应用于复杂的自定义类型。在C++中,unordered_map是一个强大的容器,但当我们想要使用自定义类型作为键时,需要做一些额外的工作。理解这个过程不仅有助于更好地使用C++标准库,还能启发我们在设计自己的数据结构时如何考虑键的比较和哈希。对象在插入map后可能被修改,需要格外小心,因为这可能改变其哈希值,导致在map中无法找到。如果哈希计算很昂贵,考虑在对象构造时预计算哈希值并存储,而不是每次都重新计算。
原创
发布博客 2024.07.19 ·
271 阅读 ·
1 点赞 ·
0 评论 ·
4 收藏

揭秘vector的魔法:push_back()的均摊O(1)复杂度之谜

vector的push_back()操作展示了计算机科学中一个有趣的现象:通过巧妙的设计,我们可以在保持高效率的同时提供方便的接口。虽然单次push_back()操作的时间复杂度可能是O(n),但从长期来看,它的均摊复杂度却是O(1)。当空间不足时,vector会重新分配一个更大的内存块,并将所有元素复制到新的位置。通常,每次需要扩容时,新的容量会是原来的1.5倍或2倍。均摊分析考虑的是一系列操作的平均成本,而不是单个操作的最坏情况。因此,n次操作的总成本小于3n,平均每次操作的成本小于3,即O(1)。
原创
发布博客 2024.07.19 ·
466 阅读 ·
3 点赞 ·
0 评论 ·
6 收藏

解密 C++ unordered_map:巧妙应对哈希冲突的艺术

然而,哈希冲突是不可避免的,unordered_map 采用了一种叫做"分离链接法"(Separate Chaining)的技术来处理这个问题。unordered_map 通过巧妙的分离链接法处理哈希冲突,在实现高效查找的同时也保证了数据的完整性。尽管如此,unordered_map 仍然能够正确存储和检索所有的键值对,这就是分离链接法的魔力所在。当不同的键被哈希到同一个桶(bucket)时,unordered_map 会在该桶中创建一个链表来存储所有映射到这个桶的键值对。如果找到匹配的键,返回对应的值;
原创
发布博客 2024.07.18 ·
772 阅读 ·
9 点赞 ·
0 评论 ·
10 收藏

揭秘Map的魔法:深入探索其底层实现原理

Map的底层实现涉及多个精妙的计算机科学概念,从哈希函数到冲突处理,再到动态扩容。理解这些原理不仅能帮助我们更好地使用map,还能启发我们在其他领域的算法设计。在理想情况下,map的主要操作(插入、删除、查找)的平均时间复杂度为O(1)。为了保持良好的性能,map会在负载因子(已使用的桶数量与总桶数量的比率)超过某个阈值时进行扩容。迭代器的实现需要考虑如何有效地遍历底层数组和处理空桶。数组的每个元素称为"桶"(bucket),用于存储键值对。由于哈希函数可能将不同的键映射到相同的数组索引,这就产生了冲突。
原创
发布博客 2024.07.18 ·
331 阅读 ·
11 点赞 ·
0 评论 ·
1 收藏

揭秘C++ vector的内存魔法:如何在效率与灵活性之间达成完美平衡?

vector维护两个关键概念:size(当前元素数量)和capacity(当前分配的内存能容纳的元素数量)。对于vector<string>,一些实现会使用小字符串优化,短字符串直接存储在string对象内,而不是堆上,这可能影响vector的内存布局。vector通常会确保其元素按照类型的自然对齐方式存储,这可能导致某些类型的vector占用的内存比严格必要的要多一些。当vector需要更多空间时,它不会每次只增加一个元素的空间,而是会分配更大的内存块。a) 分配一个新的、更大的内存块。
原创
发布博客 2024.07.17 ·
783 阅读 ·
20 点赞 ·
0 评论 ·
2 收藏

vector<bool>的隐藏陷阱:C++中这个特殊容器为何如此具有争议?

虽然vector<bool>在某些情况下可以节省空间,但它的特殊行为可能导致意外的问题。由于位压缩的实现,vector<bool>不能返回真正的引用。instead,它返回一个代理对象。由于其特殊实现,对vector<bool>的并发访问可能导致更多的线程安全问题,比其他vector类型更难以保证安全性。严格来说,vector<bool>不满足C++标准对容器的所有要求,这可能导致在泛型编程中出现问题。不同的编译器可能对vector<bool>有不同的实现,这可能导致在跨平台开发时出现一些细微的差异。
原创
发布博客 2024.07.17 ·
617 阅读 ·
8 点赞 ·
0 评论 ·
4 收藏

揭秘C++ vector的魔法:resize() vs reserve(),性能优化的关键

正确理解和使用resize()和reserve()可以显著提高你的程序性能。resize()用于改变vector中实际元素的数量,而reserve()用于优化内存分配。在你知道vector大概需要多少元素时,使用reserve()可以避免不必要的内存重分配,从而提高性能。vector类有两个常用但经常被误解的成员函数:resize()和reserve()。resize()可能会抛出异常(如果元素的构造函数抛出异常),而reserve()通常不会(除非内存分配失败)。对capacity()的影响。
原创
发布博客 2024.07.16 ·
630 阅读 ·
9 点赞 ·
0 评论 ·
9 收藏
加载更多