自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2266. 统计打字方案数

这道题,观察就会发现,我们只需要看连续一样的子串,然后看他能够形成多少个组合,然后每个这样的子串相乘就能得到结果。如何对子串进行求出组合的结果呢,这就和爬楼梯一样,遍历每一个点,看能够到达这个点的方式有多少,不断的往后递推,就能得到答案。

2024-04-22 13:40:41 175

原创 2466. 统计构造好字符串的方案数

【代码】2466. 统计构造好字符串的方案数。

2024-04-22 10:48:44 174

原创 动规之377. 组合总和 Ⅳ

遍历每种和的结果,然后从不同的结果转移过来。

2024-04-21 21:45:55 153

原创 100276. 最短路径中的边

然后dfs扩展就行了,只要链接上这个边,仍能等于最小的距离,就说明结果是最小路径上的边。从0点到各个点的距离,

2024-04-21 19:43:14 147

原创 100290. 使矩阵满足条件的最少操作次数

暴力的遍历每一修改的情况,0-9;根据前一列的状态进行转移过来,

2024-04-21 17:17:08 525

原创 洛谷P1064

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过n元钱就行”。如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。每个附件对应一个主件,附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的n元。于是,他把每件物品规定了一个重要度,分为5等:用整数1∼5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是。

2024-04-20 14:30:19 752

原创 洛谷P1776 宝物筛选

终于,破解了千年的难题。小 FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物。这下小 FF 可发财了,嘎嘎。但是这里的宝物实在是太多了,小 FF 的采集车似乎装不下那么多宝物。看来小 FF 只能含泪舍弃其中的一部分宝物了。小 FF 对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小 FF 有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为vi​,重量为wi​,每种宝物有mi​件。

2024-04-20 13:08:21 976

原创 C++堆排序

【代码】C++堆排序。

2024-04-05 16:27:12 114

原创 C++内存池

原理就是一个内存池内部拥有的空间为POOL_SIZE个自己。

2024-04-03 17:00:41 400

原创 C++面经总结2024-4-2

std::function 是 C++ 标准库中的一个通用多态函数封装器,它可以包装任意可调用对象(函数、函数指针、成员函数指针、函数对象等),并提供统一的接口进行调用。std::function 的大小在不同的实现和平台上可能会有所不同,但通常情况下,它的大小大于等于一个指针的大小。std::function 的大小通常为 32 字节的主要原因是它需要存储包装的可调用对象以及一些额外的内部数据,以提供多态性和类型擦除的功能。

2024-04-02 16:02:23 774

原创 shared_ptr

为了实现线程安全性,std::shared_ptr 使用了原子操作来保证计数器的正确性,以及使用了适当的同步机制来确保对控制块的访问和修改的原子性。控制块是一个动态分配的结构体,其中包含了指向被管理对象的指针,以及一个计数器,用于记录有多少个 std::shared_ptr 对象共享同一个控制块。std::shared_ptr 内部的实现基于引用计数技术,它使用一个辅助的控制块(control block)来跟踪指针的计数和管理资源的释放。

2024-04-02 10:23:31 250

原创 协程的好处

减少资源竞争:在多线程编程中,共享数据的访问需要进行同步,以避免竞态条件。而协程通常是单线程的,避免了多线程之间的资源竞争和锁开销,简化了并发编程。这消除了线程切换的开销,并减少了上下文切换的次数。轻量级:协程是比线程更轻量级的任务单元,它们在应用程序中的创建和销毁的开销较低。相比于线程,可以创建大量的协程而不会造成显著的资源消耗。它们可以在任务间进行高效的切换,避免了线程创建和销毁的开销,从而提高了并发性能。通过使用协程,可以使用顺序的代码来表达异步操作,而不需要回调函数或者显式的线程管理。

2024-03-30 21:28:16 153

原创 C++ empalce_back 和 push_back的区别

之前,必须创建一个元素的副本或移动语义,并将该副本或移动对象传递给函数。函数通过在容器的尾部直接构造元素,避免了复制或移动操作。则在容器尾部直接构造新的元素,并避免了额外的复制或移动操作。选择使用哪个函数取决于你的需求和元素类型的特性。它们的主要区别在于元素的构造方式和参数传递方式。函数接受一个已经构造好的元素,并将其复制或移动到容器的尾部。的参数将被传递给元素类型的构造函数,以直接在容器中构造新的元素。对于构造成本较高或无法复制的类型(如移动语义的对象)特别有用。,而不需要提前创建元素的副本或移动语义。

2024-03-26 20:13:14 246

原创 C++函数vasprintf

vasprintf会根据format字符串和可变参数列表ap的内容动态分配足够的内存来存储格式化后的字符串,并将地址存储在strp指向的指针中。其中,strp是一个指向char指针的指针,用于存储格式化后的字符串的地址;vasprintf是一个C语言标准库函数,用于动态分配内存来存储格式化后的字符串。它类似于sprintf函数,但它接受一个可变参数列表作为参数,允许用户传递任意数量的参数。使用vasprintf函数可以方便地处理需要动态分配内存的字符串拼接操作,避免缓冲区溢出的风险。

2024-03-25 11:14:16 216

原创 C++ epoll线程安全知识点

当多个线程等待在 epoll_wait 上,并且有事件发生时,每个线程都有机会调用 epoll_wait 并获取事件。但是,只有其中一个线程的 epoll_wait 返回值会是一个正数,表示成功获取到的事件数量。其他线程的 epoll_wait 返回值可能是 0 或者负数。具体而言,当有事件发生时,内核会唤醒所有等待的线程,但只有一个线程能够成功获取到事件并返回正数的返回值。其他线程在调用 epoll_wait 后可能会因为竞争条件或时间差等原因得到不同的返回值。

2024-03-20 15:12:42 166

原创 C++ boost协程测试

【代码】C++ boost协程测试。

2024-03-19 16:49:46 282

原创 C++hook知识点代码

进行同名字的函数进行定义,这时候会讲动态库中的函数给覆盖掉,但是我们又想使用动态库中的函数,此时怎么办呢,就需要dlsym这样讲其功覆盖的函数给勾出来,然后付给一个已经定义好的函数指针,此时就可以进行侵入式的hook开发了。

2024-03-18 11:00:56 227

原创 C++内存对齐知识点总结

理论上:32位系统:int 4字节,char1字节现代计算机内存空间都是按照字节划分的。理论上计算机系统对基本类型数据在内存的变量的访问可以从任何地址开始,但是时机的计算机系统对基本类型的数据在内存中存放的位置是有限制的,它们会要求这些数据的首地址的值是某个数的倍数一般为4或者是8,这就是所谓的内存对齐。

2024-03-12 22:44:03 262

原创 C++11 新特性之future和packaged_task

使用 std::launch::deferred 标志作为 std::async() 的第一个参数,可以延迟任务的执行。使用 std::launch::deferred 策略时,std::async() 函数不会创建新线程。使用 std::launch::async 标志作为 std::async() 的第一个参数,可以显式地要求任务在新线程中执行。使用 std::launch::async 策略时,std::async() 函数将创建一个新线程来执行任务,从而实现异步执行。

2024-03-09 09:39:29 495

原创 C++读写锁

【代码】C++读写锁。

2024-03-08 21:30:10 870

原创 C++八股之RAII

RAII的核心思想是利用对象的生命周期和作用域来管理资源。当创建一个对象时,该对象的构造函数会自动被调用,可以在构造函数中获取所需的资源,例如打开文件、分配内存等。当对象超出其作用域时,它的析构函数会自动被调用,可以在析构函数中释放之前获取的资源,确保资源的及时释放。它是C++中的一项重要技术,通过在对象的构造函数中获取资源,在析构函数中释放资源,来确保资源的正确管理和释放,从而避免资源泄漏和错误。通过使用RAII,可以确保资源的正确获取和释放,即使在面对异常或提前返回的情况下也能够保证资源的释放。

2024-03-08 14:20:16 198

原创 C++八股之RAII

RAII的核心思想是利用对象的生命周期和作用域来管理资源。当创建一个对象时,该对象的构造函数会自动被调用,可以在构造函数中获取所需的资源,例如打开文件、分配内存等。当对象超出其作用域时,它的析构函数会自动被调用,可以在析构函数中释放之前获取的资源,确保资源的及时释放。它是C++中的一项重要技术,通过在对象的构造函数中获取资源,在析构函数中释放资源,来确保资源的正确管理和释放,从而避免资源泄漏和错误。通过使用RAII,可以确保资源的正确获取和释放,即使在面对异常或提前返回的情况下也能够保证资源的释放。

2024-03-07 23:09:33 322

原创 C++知识点之一

但是就会出现一个问题,就是返回的对象,再也无法进行内部的任何变量的修改了。因此建议还是别加了。其实后置++,应该返回值为const temp;i++++ 这种情况的发生。

2024-03-05 22:53:08 127

原创 服务器开发不常见操作

在提供的代码示例中,GetThis是一个静态成员函数,它返回一个指向Fiber类新实例的智能指针。这段代码是有效的C++语法,因为new Fiber是合法的,即使Fiber的构造函数是私有的。在C++中,类的成员函数(包括静态成员函数)可以访问该类的私有成员,包括私有构造函数。由于这个操作是在类的静态成员函数内部进行的,它可以访问私有构造函数来创建实例。因此,尽管通常静态成员函数无法直接调用非静态成员,但它们仍然可以访问类的所有私有和保护成员,包括私有构造函数,所以代码是可行的。

2024-03-04 19:08:59 196

原创 服务器开发之多线程记录

std::shared_mutex是一个支持共享和独占两种操作的互斥量。当使用std::unique_lock对std::shared_mutex进行上锁时,它会以独占模式对互斥量进行上锁,这意味着其他线程无法同时获得共享访问权,而只能等待当前线程解锁。因此,当你使用std::unique_lock对mutex_Appender进行上锁时,其他线程无法同时获得共享访问权,它们必须等待当前线程解锁后才能继续执行。这样确保了互斥访问,只有一个线程能够访问被保护的资源。

2024-03-01 20:12:27 202

原创 服务器框架开发期间遇到的问题Yaml-cpp

在书写日志模块的时候发现,yaml-cpp如果在子类override父类的函数中使用就会在编译阶段出现问题。注释部分就是会出现错误的代码。在toYamlString函数内。这个问题就是第三方库找不到。

2024-02-28 15:53:41 352

原创 C++static总结

静态成员变量:在类中声明的静态成员变量,属于类的一部分,而不是对象的一部分。它们的生存期与静态全局变量类似,在整个程序执行期间持续存在,直到程序终止时才被销毁。静态对象的生存期与程序的生存期相同,它们在程序启动时进行构造,并在程序结束时进行析构。无论是类内的静态常量还是全局的静态常量,它们在编译时期进行初始化,并且在整个程序执行期间保持不变。在类模板中,可以声明静态模板成员,它们与类的特定实例无关,可以在模板的不同实例之间共享。当涉及静态常量时,有两种常见的情况:类内的静态常量和全局的静态常量。

2024-02-24 21:50:55 851

原创 C++设计模式之建造者模式

一个产品,产品内部存在零件,但是零件的型号不固定。建造者:建造每一部分零件。指挥者:对产品的建造过程和顺序进行指挥。引用知识星球卡尔的话文档中的话:

2024-02-20 21:24:51 364 1

原创 C++项目开发遇到的问题

如果说我将基类中的虚函数进行空实现,此时就没有问题。第一段代码没有做成动态库。第二个是做成了动态库的代码。

2024-02-20 20:06:58 162 1

原创 leetcode之105. 从前序与中序遍历序列构造二叉树

先序列表的拆分根据中序列表左孩子的元素个数和右孩子的元素个数。中序列表的拆分根据先序列表的开头的元素分为左孩子和右孩子。需要不断的进行分别拆分先序遍历列表和后序遍历列表。

2024-02-20 10:37:17 257 2

原创 syscall(SYS_gettid)

需要注意的是,虽然这是在 Linux 中的一种实现方式,但在其他操作系统上,线程的唯一标识方式可能会有所不同。这就是为什么在跨平台开发时,应该避免直接依赖于特定平台的实现,而使用更加抽象和可移植的方式,如使用 C++ 标准库提供的线程标识符 std::thread::id。syscall(SYS_gettid) 获取的 TID(线程ID)在整个系统中是唯一的,是因为该系统调用返回的是 Linux 内核为每个轻量进程(LWP,也就是线程)分配的唯一标识。在 Linux 中,线程是通过轻量进程实现的。

2024-02-15 20:21:27 278 1

原创 mac os安装cmake

然后安装打开软件,选择tools->how to install for command line use. 选择其中一个命令进行运行。下面通过cmake软件进行cmake安装。失败信息是目标文章拒绝访问。安装brew失败,未解决。

2024-02-15 17:12:35 459 1

原创 C++抽象工厂模式

【代码】C++抽象工厂模式。

2024-02-09 11:12:13 106 1

原创 C++存储区

变量的存储区域决定了其生命周期、作用域和存储方式。栈上的变量在离开其作用域时自动销毁,而堆上的变量需要手动管理内存。全局变量和静态变量在整个程序运行周期内存在,而常量通常存储在只读的区域。用于动态分配内存,即运行时由程序员手动分配和释放的区域。变量的生命周期与其所在的函数或代码块的执行周期相匹配。存储局部变量和函数调用的信息。存储全局变量、静态变量和常量。存储在程序的全局数据区域。存储在程序的全局数据区域。通常是只读的,不允许修改。存储在程序的全局数据区域。存储常量,如字符串常量。存储程序的执行代码。

2024-02-08 18:39:46 140

原创 leetcode之LCP 30. 魔塔游戏

数组的整体结果不变。只注意血量为0的时候就要开始往后移动,但是移动谁呢,移动之前血量最低的就行了。

2024-02-07 11:17:59 223 1

原创 C++工厂方法模式

就是分散的,每一个类存在一个工厂类,然后有一个总类进行类的创建。就是存在一个类,对需要创建的类进行创建。

2024-02-04 19:27:59 167 1

原创 leetcode之1686. 石子游戏 VI

还是那个道理,Alice想让A-B尽可能大,BOB想尽可能的小,因此alice是首选拿a[i]+b[i]最大的,使得增量大的。则我们就考虑,仍然在Bob全拿的基础上考虑,对于a[i]+b[i] 每次alice从大到小进行选择,使得增量尽量变大,而Bob也从大到小进行删除,使得alice拿分数的时候,a[i]+b[i]尽量小。而我们注意上述例子量的变化,如果说a不拿,b拿完则是A=0. B = 14,拿第一颗的时候是,(A+2) -( B-1) = -11。

2024-02-04 13:32:31 210 1

原创 C++单例设计模式

下面是题目。

2024-02-01 11:38:11 138 1

原创 leetcode之2140.解决智力问题

简单动态规划 超时dfs做法:dfs肯定超时,但是为了更加清晰说明动态规划,新手可先写dfs,再进行改成动态规划。

2024-01-28 21:03:03 170

原创 leetcode之365.水壶问题

贝祖定理,但是现一般想不到,但是里面存在编码技巧。

2024-01-28 16:03:19 201

空空如也

空空如也

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

TA关注的人

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