自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构和算法|排序算法系列(一)|选择排序

选择排序应该已经是最简单的排序方法了:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序区间的末尾。轮,第一轮的为排序区间长度为n,最后一轮未排序区间长度为2,所以各论循环分别包含。这是一个等比数列,所以和为。从这里可以看出,外循环一共有。

2024-05-23 13:59:20 437

原创 数据结构和算法|堆排序系列问题(一)|堆、建堆和Top-K问题

在这里不再描述大顶堆和小顶堆的含义,只剖析原理层面。

2024-05-23 13:19:42 557

原创 C++|设计模式(六)|⭐️适配器模式

适配器模式是一种结构型设计模式,。适配器这一角色,通过将一个类的接口转换成客户期望的另一个接口,使原本借口不兼容的类可以协同工作。

2024-05-23 10:00:51 21

原创 C++|设计模式(四)|代理模式

首先我们需要有公共的抽象类;public://免费电影//vip电影//用券观看委托类。它需要从公共的抽象类继承而来。public:void freeMovie() override { //免费电影cout << "观看免费电影" << endl;void vipMovie() override { //vip电影cout << "观看vip电影" << endl;void tickMovie() override {//用券观看。

2024-05-22 14:59:46 173

原创 代码随想录|代码随想录算法训练营一刷总结

印象很清楚,3月17号这天做了很多决定,其实去年就用python刷过一段时间的算法,但是很快就坚持不下去了,所以在这一天决定了:正式开始刷算法题、正式开始准备秋招、并且认认真真写博客记录自己的学习路径。我觉得不仅卡哥是在教你这门课,最大的感觉是让你体会到算法的魅力,代码随想录的整个社区氛围我也非常喜欢,潜水跟大佬们也学到了很多。最后希望自己能够坚持到最后吧。

2024-05-22 11:35:43 130 1

原创 C++|设计模式(三)|抽象工厂模式

抽象工厂模式仍然属于创建型模式,我们在这篇文章中,描述了简单工厂和工厂方法模式,并在文末,简单介绍了工厂方法模式的局限性。本文将通过汽车工厂的例子继续来阐述使用抽象工厂模式相比较于工厂方法模式的优势。

2024-05-21 11:52:46 797

原创 C++|设计模式(二)|简单工厂和工厂方法模式

本文探讨两种广泛使用的创建型模式——简单工厂模式和工厂方法模式,解释他们的实现细节、优势以及应用场景。在下一篇文章中,我会补充抽象工厂模式,其实工厂模式主要就是为了封装对象的创建过程,如果我们不进行封装,如果对象较多,创建过程就需要我们自己new来new去,并且还要记住具体类的初始化方法,还是太麻烦了。也就是说如果我们需要什么样的对象,就直接去找工厂申请,让它来代工,工厂提供了一个统一的接口。工厂模式使用的前提,一般就是我们要创建的类比较多的时候来使用,可以大大简化程序猿的工作量。

2024-05-21 11:15:20 665

原创 代码随想录算法训练营DAY57|C++单调栈Part3|84.柱状图中的最大矩形

二刷回来搞总结。

2024-05-20 22:01:57 1084

原创 代码随想录算法训练营DAY56|C++单调栈Part2|503.下一个更大元素II、42.接雨水

在前几题的练习中,我们熟悉了单调栈的工作过程,需要当前栈顶元素和当前遍历元素进行一个比较,如果当前遍历元素大于栈顶元素,此时就是我们收获结果的时候,但是这求的是当前元素右边第一个比他大的元素,左边的应该怎么求呢?其实,左边的第一个最大元素,他已经在栈内了,而且就是栈顶的第二个元素(因为我们栈是单调递增栈,左边第一个最大元素是我们遍历过的,它就在栈内)!接下来是30,我们发现当前遍历的元素大于栈口元素了,也就是说我们发现凹槽了,那么我们的凹槽元素就是10了,右柱子是30,左柱子是20。

2024-05-20 22:00:30 644

原创 C++语法|虚函数与多态详细讲解系列(包含多重继承内容)

看了(一)~(三)的讲解,该部分如果作为面试题存在,也并不需要死记硬背了,但是虚析构函数的使用时机还是非常重要的。虚继承是为解决多重继承问题专门设计的语法规则吗?我也不知道,但是虚继承确实是解决菱形问题最直接的方法!本文从汇编的角度带你理解虚函数,在CPU级的理解下,静态绑定和动态绑定也不过是很简单的内容。该文章基本解决了虚函数表和虚函数指针的构造时机,是理解虚函数和多态的前置内容。你真的理解类对象的内存结构吗?抽象类是一种很常见的设计理念,简单但是重要!本文从类的内存结构带你真正理解多态。

2024-05-20 21:36:43 340

原创 C++语法|虚函数与多态详细讲解(三)|深入理解多态

本文主要内容来自首先我们需要明确一点,很多语言都支持多态,与其说多态是语法规则,不如说是一种设计技巧,多态不仅有代码复用的特性,它的精髓就在于虚函数的存在,使得我们能够完成函数的“覆盖”或者说“重写”。我们首先要明确多态的基本规则:多态,常会用基类指针指向派生类对象多态,会利用派生类的结构特点复用基类的属性(变量/函数)多态,会利用虚函数来扩展派生类的特性。

2024-05-20 21:24:46 498

原创 C++语法|虚函数与多态详细讲解(二)|深入理解虚函数

本文主要内容来自。

2024-05-20 20:41:16 429

原创 C++语法|虚函数与多态详细讲解(一)|再谈构造函数(构造函数与虚函数表)

本文主要内容来自。

2024-05-20 20:06:58 364

原创 C++语法|C++11标准实现生产者消费者模型

在多线程编程中,生产者-消费者问题是一个经典的同步问题,它涉及到两种类型的线程:生产者和消费者。生产者负责生成数据放入缓冲区,而消费者则从缓冲区中取出数据。本文将详细介绍如何使用 C++11 的新特性来实现这一模型。首先,定义了一个名为Queue的类,它是生产者和消费者共享的队列。该队列内部使用std::queue来存储数据,并配有std::mutex和std::condition_variable来实现线程同步。put方法:当生产者生成一个新的物品时,首先会获取互斥锁。

2024-05-20 16:22:53 359

原创 C++语法|虚函数与多态详细讲解(五)|虚函数的调用一定是动态绑定吗?

在类的构造函数中,调用虚函数,也是静态绑定(构造函数中调用其他函数(虚),不会发生动态绑定)

2024-05-20 16:02:14 260

原创 C++语法|虚函数与多态详细讲解(四)|哪些函数不能实现成虚函数和虚析构函数的理解

我们简单分析一下就知道,由于我们的指针是Base*类型,所以它的析构函数属于静态绑定,绑定的是Base的析构函数,所以我们在释放内存时,只调用了Base的析构函数。基类的指针(引用)指向堆上new出来的派生类对象的时候,delete pb(基类的指针),他调用析构函数的时候,必须发生动态绑定,不然会导致派生类的析构函数无法被调用。随后我们调用pd指向的show(),调用的是Derive::show(),这是由于该函数是动态绑定的。最后我们释放pb的内存,竟然只析构了Base(),不析构Derive()!

2024-05-20 16:02:05 874

原创 C++|四种方法解决三线程按顺序轮流打印ABC的问题:互斥锁和条件变量、原子操作、信号量

无锁实现控制打印顺序,但会占用更多的CPU资源,因为线程在等待时处于忙等(busy-waiting)状态。C++20之后引入的库,才使得C++语言级别的信号量实现,编译的时候记得加一个。

2024-05-20 16:01:10 200

原创 C++|设计模式(一)|单例模式与多线程

本文讲解重点在线程安全的懒汉式单例模式。

2024-05-20 11:54:40 970

原创 C++语法|C++的类型转换:const_cast、static_cast、reinterpret_cast、dynamic_cast

由于我们的derive02func()是新写的函数,基类中也不存在该虚函数,所以只能是静态绑定,我们也只能通过Derive2类型的指针来进行访问。dynamic_cast往往用在继承结构中,特别是存在虚函数表的情况下,该方法对于统一接口的改进,使得多态能够变得更加灵活。我们可以使用C风格的方式进行类型转换,我们也可以用C++风格的类型转换,想把它转成什么类型,尖括号<>就写什么类型。此时我们需要关注 *p的类型,当它是Derive2类型的,我们就需要去调用。

2024-05-19 21:52:38 750

原创 C++语法|多重继承详解(二)|菱形继承的问题及解决方法

多重继承很容易导致菱形继承的问题:这里有一个很明显的问题,我们的D不仅从基类B中继承到了ma,还从基C中也继承到了ma。这在软件设计过程中肯定是有问题的。这就是所谓的菱形继承问题。这种设计模式也有很明显的问题。

2024-05-19 20:25:09 774

原创 C++语法|多重继承详解(一)|理解虚基类和虚继承

我们可以看出,其中实例化A的对象a占4个字节;实例化B的对象b占8个字节。在这里,我们的类A被virtual修饰,所以A被称为虚基类。A 和 B 的继承关系就是虚继承此时我们的 A 还是占 4个字节;但是 B 却占了12个字节??

2024-05-19 20:24:59 891

原创 C++语法|虚函数与多态详细讲解(七)|理解抽象类?(面试向)

在这里,我们的动物是一个基类。我们需要明确,定义Animal的初衷,并不是让Animal抽象某个实体的类型。定义某一个基类,并不是让该类抽象某个实体的类型。总结1:抽象类和普通类有什么区别?总结2:一般把什么类作为抽象类?

2024-05-19 17:30:11 166

原创 C++语法|虚函数与多态详细讲解(六)|如何解释多态?(面试向)

多态分为了两种,一种是静态的多态,一种是动态的多态。

2024-05-19 17:17:57 253

原创 C++语法|继承与多态|成员的重载、隐藏和覆盖

如果发生了基类与派生类中有成员名字相同时,那么他们之间肯定是要产生关系的,所以这就涉及到了成员的重载、隐藏和覆盖。

2024-05-19 15:00:34 328

原创 C++语法|多态基础|派生类与基类对象的相互转换

从基类对象到派生类对象的转换在 C++ 中不是隐式允许的,因为这种转换通常是不安全的。如果必须进行此类转换,需要使用 static_cast,但这种做法通常不推荐,因为它违背了面向对象的多态原则,并且可能导致运行时错误。当派生类对象赋值给基类对象时,只有派生类对象中的基类部分会被复制到基类对象中,这个过程通常称为“对象切割”(Object Slicing),其中派生类独有的任何属性或方法都不会被复制。我们将派生类赋给了基类,这是被允许的!红色部分是派生类特有的成员,蓝色部分是派生类从基类继承的成员。

2024-05-19 13:15:02 236

原创 C++代码|继承的本质(一)|代码的复用|不同继承方式对基类和派生类访问限定的影响

外部只能访问对象public的成员,protected和private的成员无法直接访问。在继承结构中派生类从基类可以继承过来private的成员,但是派生类却无法直接访问。protected和private的区别?在基类中定义的成员,想被派生类访问,但是不想被外部访问,那么在基类中,把相关成员定义成pretected保护的;如果派生类和外部都不打算访问,那么在基类中,就把相关成员定义成private私有的。

2024-05-19 10:54:56 413

原创 C++语法|emplace_back vs.push_back|他们的效率真的有区别吗?|最后讨论一个突发问题

STL版本如下:Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.我们首先分析该函数:用于在 vector 容器的末尾构造一个新的元素。该函数利用完美转发(perfect forwarding),将参数直接传递给元素的构造函数,从而在容器的存储空间中直接构造对象。具体细节感兴趣可以自行查看对于emplace_back我们只分析其核心代码:关于这段代码,我在【对象优化(三)|move移动语义和for

2024-05-18 18:17:13 735

原创 C++语法|⭐️对象优化(三)|move移动语义和forward类型完美转发

尽管所以我们上面的右值版本的push_back(T &&val),函数体中val还是一个左值,所以我们这段_allocator.construct(_last, val);std::forward可以根据我们参数val本身的定义,推导出我们的val到底是一个左值还是右值。但是我们这里仍然有很多问题,我们尽管提供了相应方法的右值版本,但是由于语法规则,右值引用变量其实是一个左值,所以在函数体内仍然无法分辨出该变量是一个右值引用,我们不得不添加std::move移动语义来把变量转换为一个右值。

2024-05-18 16:54:04 617

原创 C++语法|⭐️对象优化(二)|带右值引用参数的拷贝构造和赋值函数来完善string类

我们在实现了基本的string类。然后在中我们完善了string的各类接口和功能,但是我们仍然忽略了一些重要的问题,在本文中,我们会加以阐述。为了简化问题,首先我给出一个CMystring的代码(不包含迭代器,只有基本实现),在最后实现了一个GetString全局函数。

2024-05-17 22:11:33 822

原创 C++ STL标准库解析|vector向量对象的迭代器实现vector::iterator

并且我们已经实现了string对象的迭代器,那么今天必然是填vector得坑啦!回顾完前面的文章,现在开整!

2024-05-17 20:37:27 413

原创 C++ 语法|把类成员方法声明为常方法的必要性

public:// 方法体在方法名后面的 const 关键字表明该方法不会修改类的任何成员变量。

2024-05-17 20:00:50 258

原创 C++ STL标准库解析|实现string类的迭代器string::iterator

的迭代器标识这样我们也可以遍历到底层的最后一个元素。循环过程中做了++it,说明我们当前迭代器要跳到下一个迭代器来完成遍历,至于它底层到底是数组、链表还是哈希表无论是什么我们都不用管,我们作为使用者只需要对迭代器进行++即可。底层数据结构如何到下一个元素的具体操作都封装在了我们迭代器的++操作中,用户作为使用者是无感的(这就是所谓的透明地访问容器内部元素的值)。最后打印使用迭代器进行解引用。

2024-05-17 15:49:29 938

原创 C++语法|++i和i++的效率问题|重载前置++运算符和重载后置++运算符

+i 和 i++在不涉及到类的前加和后加,除了代码顺序的差异,其实在效率上来说并没有什么区别。如果加上编译器的优化,他们生成的汇编指令可能是完全相同的。但是我们今天主要就讨论这样的情况。如果把i++比做一个函数,由于语法规则的要求,它只能把加1千的原始值,返回给主调函数。所以,在自加1之前,它需要用一个临时变量,保存自己的原始值,而构建原始原谅的这个操作就是占用内存和CPU资源的始作俑者。

2024-05-17 15:38:26 771

原创 C++ STL标准库解析|简单实现STL容器string代码

我们还需要重点关注operator+,其实该函数功能上确实是没有问题的,而且也没有内存泄漏的问题。return tmp;但是该函数的效率比较低,主要是因为首先,ptmp指向了我们new出来的一块大内存,然后我们分别进行字符串拷贝和字符串连接;随后传入到tmp构造函数中。然后这个tmp又会根据我们外面传进来的指针再进行一次new,然后再次进行拷贝strcpy;if (p!} else {最后我们又delete掉ptmp。

2024-05-17 12:11:25 829

原创 C++语法|函数返回一个类对象会发生什么?临时对象的深拷贝、返回值优化(ROV)和移动语义

在我们写了一个自己的string,然而在写operator+时,这里返回了一个对象,且其中的代码效率较低(具体可以回看文章的结语部分)。那么我有一些疑问现在算是搞懂了,现在分享出来。在这段代码中我们一共经历了ptmp的内存开辟,字符串复制和连接操作和内存释放;tmp的构造和析构。其中涉及的操作太多,导致性能较低。

2024-05-17 12:09:55 309

原创 C++ STL标准库解析|⭐️vector容器的空间配置器allocator

之前在文末,我们三大灵魂拷问,空间配置器是什么?为什么要空间配置器?没有会发生什么呢?本篇文章我们就从这三个问题入手,然后实现空间配置器。

2024-05-16 22:07:59 1043

原创 C++ STL标准库解析|简单实现STL容器vector代码和容器空间配置器

/指向数组起始的位置T *_last;//指向数组中有效元素的后继位置T *_end;//指向数组空间的后继位置。

2024-05-16 19:26:12 734

原创 C++语法|函数模版?模版函数?深入理解函数与模板与分文件编写

当然了你如果一定要分文件写也是可以的,直接。

2024-05-16 16:44:55 915

原创 数据结构与算法|算法总结|动态规划之编辑距离总结篇

啥也不说先上图!本节一共总结了六道题,个人认为作为二维dp的典型用法,所以归纳到了一起,方便对比、类比学习。

2024-05-16 14:57:30 904

原创 C语言学习细节|C语言面向对象编程!函数指针如何正确使用

函数指针就是一个指向函数的指针变量,与指向数据的指针不同,函数指针保存的是函数的地址,这使得程序可以动态地调用不同的函数,而无需在编译时确定具体的函数。可以在程序运行时动态得传递和调用不同的函数。

2024-05-15 21:47:08 593

李宏毅老师语音识别课程

想起课程B站上有: 课程主页如下 [李宏毅DLHLP2020课程资料首页](http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html )

2023-09-12

空空如也

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

TA关注的人

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