自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 收藏
  • 关注

原创 [Go语言快速上手]函数和包

我们来看一下下图,如果将所有函数都写在一个文件里那么会很难阅读,同时模块划分也会很混乱,所以我们可以把一些工具函数写在其他包中,在需要使用的地方导入包即可。Go中的函数与其他函数中功能大差不差,只是格式不同,当然也更加简便,从中可以看到其他语言的影子,但是开发效率会高上不少。我们来看这一种情况,将函数赋值给一个变量,这个变量就是一个函数,和我们之前学习的函数指针非常像,回调函数的场景应用非常多。以上就是Go中一些函数和包的简单使用,在实际应用场景中可能更多的用法,就需要我们在这些基础上进行操作。

2024-10-02 21:53:14 1625 1

原创 [Go语言快速上手]初识Go语言

Go语言,通常被称为Golang,是一种静态类型、编译型的计算机编程语言。它由Google的Robert Griesemer、Rob Pike及Ken Thompson等设计,并于2009年正式发布。Go语言的设计目标是为了与C++相比,Go语言的设计更加现代,简化了很多C++中复杂的特性,同时提供更好的开发体验和更高的生产率。C++是一种功能强大且灵活的语言,支持面向对象编程、泛型编程以及过程化编程,但是它的学习曲线较陡峭,且容易出现内存管理和类型安全方面的问题。

2024-10-01 16:37:30 1612

原创 std::futrue异步操作结果的三种搭配使用

换种说法就是之前说过std::future可以读取⼀个异步函数的返回值了, 但是要等待就绪, ⽽std::promise就提供⼀种⽅式⼿动让 std::future就绪。std::future::get()函数来获取任务的结果,此函数会阻塞当前线程,直到异步操作完成。可以把std::future和std::async看成是分开的, ⽽ std::packaged_task则是⼀个整体。std::launch::deferred | std::launch::async 内部通过系统等条件⾃动选择策略。

2024-08-28 22:13:24 844

原创 通过源码分析如何使用muduo库实现自定义应用层协议

自定义应用层协议是指在标准传输层协议(如TCP或UDP)之上定义的一套规则,用于描述应用程序如何在两个或多个端点之间交换数据。数据格式消息结构传输规则错误处理会话管理在muduo网络库中,使用和来实现不同消息类型的处理。在这个场景中,和数据格式:使用Protocol Buffers作为序列化和反序列化数据的工具,Protocol Buffers是一种高效的二进制格式,支持多种编程语言。消息结构:定义了不同类型的Protocol Buffers消息,每种消息类型都有其特定的字段和数据结构。

2024-08-10 16:17:54 1400 2

原创 仿RabbitMQ实现消息队列———整体框架

在实际的后端开发中, 尤其是分布式系统⾥, 跨主机之间使⽤⽣产者消费者模型, 也是⾮常普遍的需求。因此, 我们通常会把阻塞队列封装成⼀个独⽴的服务器程序, 并且赋予其更丰富的功能。这样的服务程序我们就称为 消息队列 (Message Queue, MQ)。其中 RabbitMQ 是⼀个⾮常知名、功能强⼤且⼴泛使⽤的消息队列。本项目就是仿照RabbitMQ模拟实现一个简单的消息队列。

2024-07-30 18:28:16 1635 1

原创 网络基础篇:网络模型

当我们考虑进程间通信时,我们实际上是在考虑如何在不同的实体(进程)之间交换信息。然而,当这些实体跨越不同的设备或系统时,我们就需要引入更高级别的通信机制,即。是一种允许设备(如计算机、服务器、移动设备等)通过某种形式的连接(如电线、光纤、无线电波等)进行通信的系统。要解决上述问题,网络结构分层是计算机网络设计中的一个重要概念,它将复杂的网络通信过程划分为若干个独立的、相对简单的层次,每个层次都有其特定的功能和协议。这样做的目的是为了简化网络设计和实现,提高网络的可维护性和可扩展性。

2024-06-20 11:11:43 968 1

原创 Linux线程(五)线程池的模拟实现

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建的线程集合(线程池)中分配这些任务进行执行。线程池的主要目的是重用线程,减少线程创建和销毁的开销,提高系统效率,并简化并发编程的复杂度。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。

2024-05-19 21:37:24 1206 4

原创 在阿里云服务器上安装MySQL

在阿里云服务器上安装MySQL的基本教程,本次示例以Centos7来示例,具体安装可以根据系统适合的安装包来选择。

2024-05-14 23:03:45 2455 3

原创 Linux线程(四) 生产者消费者模型

生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。

2024-05-14 19:35:21 1193 2

原创 Linux线程(三)死锁与线程同步

在Linux环境下,条件变量是线程同步的一种机制,用于实现线程间的协作,使得一个线程能够等待某个条件变为真,而另一个线程负责改变这个条件并通知等待的线程。条件变量通常与互斥锁一起使用,以确保在检查条件和修改条件时的原子性和一致性。

2024-05-13 13:00:30 960 2

原创 Linux线程(二)线程互斥

在Linux系统中,线程互斥是一种确保多个线程在访问共享资源时不会产生冲突的机制。这是通过使用互斥锁(Mutex)来实现的,它是防止并发执行线程同时进入临界区(即访问共享资源的代码段)的一种同步原语。

2024-05-11 22:57:45 737 4

原创 滑动窗口篇: 长度最小子数组|无重复字符最长字串

滑动窗口算法更加灵活,可以应用于多种问题场景,如子数组和问题、无重复字符的子串问题、特定模式匹配等,而暴力解法则更多依赖于直接枚举,适用范围相对较窄。

2024-05-10 23:52:24 910 1

原创 Linux线程(一)初识线程

在Linux中,线程(thread)是一种轻量级进程(Light-weight Process, LWP)的概念,它是进程内部的一个执行流,代表了程序中的一个独立执行路径。

2024-05-09 23:22:19 1496

原创 Linux:进程通信(三)信号的捕捉

Linux信号的捕捉流程涉及几个关键步骤,主要通过使用signal或更推荐的sigaction系统调用来实现。

2024-05-09 12:07:00 1407

原创 C++中的异常处理方式

在C++中,异常是程序运行期间发生的意外或错误情况。这些情况可能会导致程序无法继续正常执行,但又不能在当前的代码位置立即处理。异常提供了一种机制,使得在错误发生时可以将控制权从当前代码的执行位置转移到异常处理代码的位置,从而进行适当的处理。

2024-05-07 23:22:58 1591 3

原创 Linux:进程通信(二)信号的保存

上篇文章我们讲解了信号的产生:Linux:进程信号(一)信号的产生接下来我们来看一下信号的保存信号的处理是否立即进行,取决于信号的类型、进程的当前状态,以及进程对信号的处理策略。

2024-05-07 11:31:12 1120 4

原创 C++:特殊类的设计 | 单例模式

在单例模式中,类通常会提供一个静态成员函数来获取类的唯一实例,并且将构造函数设置为私有,以防止直接实例化类的对象。如果类的实例尚未创建,则静态成员函数会创建一个实例并返回它,否则会返回已存在的实例。

2024-05-06 18:33:06 780 3

原创 Linux:进程信号(一)信号的产生

信号是一种进程间通信机制,用于通知进程发生了特定事件。这些事件可以是来自内核的通知(例如,进程已经终止)或者其他进程发送的信号。信号可以被用来实现进程之间的同步、中断处理、错误处理等。

2024-05-06 18:32:28 1180 4

原创 C++11:lambda表达式及function包装器

Lambda表达式是一种在C++11中引入的功能,允许我们定义匿名函数。它的语法比较简洁,可以方便地在需要函数对象的地方使用,例如STL算法、线程、智能指针等。

2024-05-04 21:58:03 1244 2

原创 C++:智能指针(RAII思想)

智能指针是一种用于管理动态分配的内存的 C++ 类。它们提供了对堆内存的自动分配和释放,以防止内存泄漏和悬挂指针的情况。常见的智能指针包括 std::unique_ptr、std::shared_ptr 和 std::weak_ptr。

2024-05-04 12:51:31 1346 1

原创 C++: IO流

文件 I/O 流在 C++ 中用于实现文件的读取和写入操作。它的主要组成部分包括文件流对象、文件打开和关闭、读取和写入文件数据、文件位置指针、文件状态检查以及错误处理。通过 ifstream、ofstream 和 fstream 对象,可以实现对文件的读取、写入和读写操作。

2024-04-24 13:40:09 762 2

原创 C++:类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:static_cast、reinterpret_cast、const_cast、dynamic_cast

2024-04-17 21:55:17 764 1

原创 C++11新特性系列(一)

C++11是C++语言的一个重要版本,于2011年发布。它引入了许多新特性和改进,以提高C++语言的表达能力、可移植性和性能。

2024-04-16 21:52:06 719 2

原创 C++:Hash应用【位图与布隆过滤器】

我们先来看一个问题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】如果我们使用unordered_set容器来解决,40亿个数据,每个数据占4个字节,那么一共需要16G内存,对于内存消耗太大了,而如果存储的不是整形数据,那么只会消耗更大。这个时候我们可以引出位图,每个整数是否存在可以使用一个对应比特位的0或者1来表示,这样原来32位才能表示一个数,现在只需要1位就可以解决,40亿个数据只需要0.5G。

2024-04-15 19:52:34 592 1

原创 unordered系列容器OJ

在C++标准库中,unordered系列容器是基于哈希表实现的,用于存储唯一键(对于unordered_set)或键值对(对于unordered_map),其中键具有唯一性。与map和set这类基于红黑树的容器相比,哈希表能够提供平均时间复杂度为O(1)的快速访问性能,不过在最坏情况下可能退化到O(n)。

2024-03-31 17:50:48 821 2

原创 双指针算法篇:两数之和 、三数之和

我们依旧使用左右指针的方法,需要先确定一个值,在这里我们用i来表示,nums[i]来做第一个值,每次循环时,使用target=-nums[i]来记录,以上就是两数之和和三数之和的解题思路,至于后面的四数之和,思路也与上面一致 ,先排序,然后依次确定第一,第二,第三,第四个数,并注意去重。当调整完后,如果值与上一个值相同,那么结果也肯定是相同的,所以要跳过相同的值,同时也要注意i的去重。我们先对数组进行排序,这样有利于返回数组的去重工作,因为有序状态下,重复的三元组中的顺序是一样的。

2024-03-28 16:42:22 1499 1

原创 用红黑树封装实现map和set

map和set都是基于红黑树实现的。红黑树是一种自平衡的二叉搜索树,它保持着良好的平衡性能,插入、删除、查找的时间复杂度都是O(log n)。在C++ STL中,map和set都是使用红黑树作为底层数据结构来实现的。

2024-03-15 16:45:23 1121 2

原创 数据结构:红黑树的模拟实现

前面的文章我们讲解了AVL树,AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证查询时高效的时间复杂度。但是AVL树为了保持平衡要旋转来操作,在删除时有可能要一直旋转到根部,效率就会比较低下,如果数据的个数为静态的(即不会改变),可以考虑AVL树,如果一个结构经常修改,那么红黑树是个不错的选择。

2024-03-13 21:23:53 1285 1

原创 C++:多态

多态是面向对象编程中的一个重要概念,它允许不同类的对象对同一个消息作出不同的响应。在C++中,多态性通过虚函数和指针/引用实现。

2024-03-09 13:00:40 845 2

原创 数据结构:AVL树

两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右 子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。

2024-03-07 20:07:59 1646 3

原创 C++:菱形继承问题

在C++中,菱形继承是指一个派生类同时继承自两个直接或间接基类,而这两个基类又继承自同一个基类。这种继承结构形成了一个菱形的图形,因此得名菱形继承。菱形继承可能会引起一些问题,其中最主要的问题是数据冗余。由于派生类继承了两个基类,这两个基类都可能包含相同的数据成员,导致派生类中存在两份相同的数据,造成数据冗余和浪费内存。单继承:一个子类只有一个直接父类时称这个继承关系为单继承多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承菱形继承:菱形继承是多继承的一种特殊情况。

2024-03-02 17:28:42 2363 3

原创 C++:继承

继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。

2024-03-02 16:15:44 939 3

原创 数据结构:二叉搜索树(非递归实现)

二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,其中每个节点的值大于其左子树中所有节点的值,小于其右子树中所有节点的值。如果不为根节点,那么需要判断该节点是prev(该节点的父节点)的左孩子还是右孩子,让对应的指针指向该节点的左孩子即可。不为根节点,判断该节点是prev(该节点的父节点)的左孩子还是右孩子,让对应的指针指向该节点的右孩子即可。如果为根节点,那么直接让该节点的左孩子变为根节点即可。如果为根节点,同上操作,只是变为对该节点右孩子的操作。

2024-03-01 15:18:32 1246 1

原创 Linux开发工具的使用 (gcc/g++ | gdb)

Linux是一个广泛用于开发的操作系统,提供了许多强大的工具和环境来支持开发者.

2024-02-09 16:50:17 1085 1

原创 开源软件:推动技术繁荣

开源软件的低成本、可协作性和透明度等特点,使得越来越多的企业和个人选择使用开源软件,促进了软件行业的繁荣。然而,在使用开源软件的过程中,也需要关注其可能带来的问题,如安全风险和维护困难等。因此,如何更好地利用开源软件的优势,发挥其推动技术创新和应用的作用,是当前热门的话题之一。开源社区是一个合作和交流的环境,人们可以共同开发新的软件和功能,分享经验和知识,解决问题。另外,开源软件通常具有高度的可定制性和可扩展性,用户可以根据自己的需求定制软件,满足不同的应用场景和需求,进一步促进了技术创新的发展。

2024-02-06 22:40:21 1335

原创 C++:模板特化 非类型模板参数

假设有一个模板类,可以通过偏特化来为指针类型提供特殊的实现,或者为特定的数据结构提供特殊的处理。另外,也可以使用C++全特化来为特定的参数提供特殊的实现,以满足特定的需求。C++偏特化是模板编程中的重要特性,可以帮助我们根据具体的需求为模板提供更灵活和具体的实现。可复用性:通过特化模板,可以在不同的情况下重复使用通用的代码结构,从而提高代码的可复用性。提高性能:通过特化模板,可以为特定的类型或参数提供更高效的实现,从而提高程序的性能。运行发现比较的并不是预想中的a<b 而是比较的两个指针的大小。

2024-01-28 15:51:44 1126

原创 Vector OJ:电话号码组合 数组中超过一半的数字

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。否则,我们获取当前位置处数字的数值,并使用for循环遍历与该数字关联的字母。给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。,分别用来记录当前数字的出现次数和出现次数超过一半的数字。的字符串,返回所有它能表示的字母组合。中的最后一个字符,以进行回溯并尝试下一个字母。的数组,用于存储数字与字母的映射关系。,即为数组中出现次数超过一半的数字。

2024-01-25 23:58:09 925

原创 C++:反向迭代器-reverse_iterator

在C++中,可以使用反向迭代器来逆序遍历容器中的元素。反向迭代器是通过rbegin()和rend()方法来获取的,它们分别指向容器的最后一个元素和第一个元素的前一个位置。此类反转双向或随机访问迭代器循环访问范围的方向。原始迭代器(基础迭代器)的副本保留在内部,用于反映在reverse_iterator上执行的操作:每当reverse_iterator递增时,其基本迭代器就会减少,反之亦然。可以随时通过调用成员 base 获取具有当前状态的基迭代器的副本。

2024-01-25 20:50:35 1522 1

原创 C++:优先队列-Priority_queue

top 元素是priority_queue中比较较高的元素,以及调用 priority_queue::p op 时从容器中删除的下一个元素。此成员函数有效地调用基础容器对象的成员函数push_back,然后通过对包含容器的所有元素的范围调用 push_heap 算法,将其重新排序到堆中的位置。使用的范围是 [first,last),它包括 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。在对基础容器进行排序之前,将此序列中的元素插入到基础容器中。

2024-01-24 17:08:08 2874 1

原创 C++: vector

C++中的vector是一个动态数组容器,可以存储任意类型的数据。它提供了动态大小的数组功能,可以在运行时动态地增加或减少其大小。vector是C++标准模板库(STL)中的一部分,因此可以使用标准库中提供的许多函数和算法来操作它。

2024-01-23 14:11:57 1050 1

空空如也

空空如也

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

TA关注的人

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