C++学习
文章平均质量分 76
FHKHH
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
哈希表(Hash Table)详解
✅ 查找、插入、删除速度快(O(1) 平均)✅ 适合需要频繁查询的数据结构。原创 2025-03-10 17:00:25 · 843 阅读 · 0 评论 -
*C++ 集合(`set`、`unordered_set`、`map`、`unordered_map`)全面解析
容器有序性唯一性底层结构时间复杂度适用场景set✅ 升序键唯一红黑树O(log n)有序唯一集合❌ 无序键唯一哈希表O(1) 平均, O(n) 最坏快速查找无需排序map✅ 升序键唯一红黑树O(log n)有序键值对❌ 无序键唯一哈希表O(1) 平均, O(n) 最坏快速键值查找multiset✅ 升序允许重复红黑树O(log n)有序可重复集合multimap✅ 升序允许重复键红黑树O(log n)有序键可重复映射❌ 无序允许重复哈希表。原创 2025-03-10 16:55:58 · 1335 阅读 · 0 评论 -
C++ `release-acquire` 与 `release sequence` 深入解析
操作后,若对同一原子变量存在一系列特定操作(属于。:确保跨线程内存操作的可见性和顺序性。存储的值,则线程B能观察到线程A在。后的操作不满足以下任一条件,之前的所有内存操作。原创 2025-03-07 20:13:53 · 712 阅读 · 0 评论 -
C++ 中前置 `++` 与后置 `++` 运算符重载
需要返回自增前的旧值,但旧值在运算后已被修改。为了保存旧值,必须在函数内部创建一个临时对象(拷贝原对象的状态),并将该临时对象返回。由于需要保存旧值,会触发拷贝构造函数和析构函数的额外开销,尤其对复杂对象(如容器迭代器)性能影响显著。,既能保证代码效率,又能避免逻辑错误,是高质量 C++ 代码的重要实践。,直接修改原对象并返回其引用,效率更高。),与内置类型的语义保持一致。操作的对象是临时值,而非原对象。通过合理选择前置/后置。原创 2025-03-06 20:26:26 · 642 阅读 · 0 评论 -
C++中`const` 和 `static` 关键字详解
关键字作用域修饰成员变量修饰成员函数const只在对象内部有效,每个对象可以不同变量在对象生命周期内不可变不能修改成员变量,const对象只能调用const函数static作用于整个类,所有对象共享变量归类所有,必须在类外初始化不能访问非static成员,没有this指针:指向的值不能变,指针本身可以变。:指针本身不能变,指向的值可以变。static变量是全局的,所有对象共享一份。static成员函数没有this指针,只能访问static变量。const和static。原创 2025-03-06 19:54:18 · 617 阅读 · 0 评论 -
C++中`const int*` 与 `int* const` 的区别及记忆技巧
类型指针能否修改?指向内容能否修改?✅❌❌✅❌❌记住这张表格,随时回顾,快速掌握知识。原创 2025-03-06 19:41:13 · 445 阅读 · 0 评论 -
C++ 虚函数、虚函数表、静态绑定与动态绑定笔记
虚函数表是 C++ 编译器实现动态绑定的核心机制。原创 2024-12-23 12:06:54 · 1015 阅读 · 0 评论 -
迷宫路径搜索:广度优先搜索(BFS)
通过 BFS,可以高效解决迷宫路径搜索问题。其核心逻辑是逐层扩展节点,记录访问状态与前驱关系,最终反推路径。完整代码实现了从输入迷宫到输出路径的全过程,便于理解和实践。是一种在图或网格结构中逐层扩展节点的搜索算法,适合用于解决最短路径问题。原创 2024-12-06 21:17:09 · 1343 阅读 · 0 评论 -
深度优先搜索迷宫路径
我们需要编写一个程序,通过深度优先搜索(DFS)找到从迷宫左上角到右下角的一条通路。迷宫的表示:功能需求:我们使用深度优先搜索(DFS)来遍历迷宫:节点 ():迷宫 ():栈 ():输入:初始化:搜索路径:输出:关键点总结避免魔法数字:清晰的逻辑:动态分配二维数组:代码可读性高:扩展性强:输入:输出:如果路径不存在,输出:深度优先搜索(DFS)迷宫路径算法详细解释DFS 基本概念深度优先搜索(DFS)是一种用于遍历或搜索图或树结构的算法。它优先沿着每一个可能的分支路径深入,直到到达不可原创 2024-12-05 23:06:04 · 1059 阅读 · 0 评论 -
观察者模式(Observer Pattern)
使得当一个对象的状态发生改变时,所有依赖它的对象都会收到通知并自动更新。观察者模式是一种行为型设计模式,定义了一种。原创 2024-12-05 22:19:19 · 797 阅读 · 0 评论 -
适配器模式(Adapter Pattern)
适配器模式是一种结构性设计模式,通过创建一个中间适配层,使得接口不兼容的类可以一起工作。原创 2024-12-05 21:52:12 · 625 阅读 · 0 评论 -
装饰器模式(Decorator Pattern)
装饰器模式是一种结构性设计模式,通过。:以汽车为例,实现动态添加。,而无需修改原有类。原创 2024-12-05 21:26:55 · 596 阅读 · 0 评论 -
代理模式(Proxy Pattern)详解
代理模式是一种结构型设计模式,通过创建代理对象来间接访问目标对象(委托类),实现对目标对象的访问控制、权限验证、延迟加载或功能增强。代理对象起到中介作用,它不仅仅是对目标对象的直接替代,还能在访问目标对象时增加一些额外的逻辑。原创 2024-12-05 19:46:44 · 1048 阅读 · 0 评论 -
多线程编程:Atomic 原子类型与 CAS(Compare-And-Swap)
定义Atomic 是 C++ 提供的一种线程安全的类型,通过底层硬件指令(如 CAS)保证操作的原子性。所有对原子类型的操作(如加减、赋值)在多线程环境中是不可中断的。特点无需锁的线程安全不需要使用std::mutex或其他锁机制。硬件支持依赖于硬件指令集(如CAS)实现高性能原子操作。性能优越避免了线程切换和锁的上下文切换,尤其在简单场景下性能显著提升。比较共享内存中的当前值与期望值。如果相等,则将内存值更新为新值。如果不相等,则返回当前值,通常会重新尝试操作。原创 2024-12-04 23:42:36 · 1324 阅读 · 0 评论 -
多线程编程:线程间的同步与通信
互斥锁的作用确保线程安全,避免共享资源的并发访问导致的数据竞争。条件变量的作用线程间的同步通信,协调线程的执行顺序。核心操作std::mutex:加锁与解锁。:线程等待(wait)与通知(notify_all和notify_one生产者-消费者模型的实现使用共享队列进行数据传递。条件变量协调线程之间的依赖顺序。原创 2024-12-04 23:12:54 · 1130 阅读 · 0 评论 -
绑定器与函数对象
是一个通用的函数封装器,可以保存任何可调用对象(普通函数、成员函数、Lambda 表达式、绑定器)。线程池是一种常用的并发编程工具,用于管理和复用固定数量的线程,避免频繁创建和销毁线程带来的性能开销。以下是如何将类成员函数绑定为任务并添加到线程池。是 C++11 引入的工具,用于将函数或成员函数与特定的参数绑定,生成一个新的。实现线程池的完整示例及细致讲解,帮助更深入理解绑定器在实际项目中的应用。线程池的核心功能是管理线程,所以需要一个容器存储所有线程的句柄。上述实现中,线程的任务是固定的(原创 2024-12-04 16:37:09 · 1106 阅读 · 0 评论 -
右值引用与临时对象优化总结
通过右值引用优化临时对象的处理,能有效提升程序效率,是 C++11 的重要特性之一。原创 2024-12-02 20:46:47 · 861 阅读 · 0 评论 -
临时对象优化详细讲解与代码示例
通过移动语义优化,尤其是在涉及复杂数据类型或大规模字符串处理时,可以显著提升程序效率。,允许对象在临时状态下直接转移资源,而无需进行深拷贝。原创 2024-12-02 17:31:43 · 371 阅读 · 0 评论 -
C++对象构造、赋值、拷贝与析构详解
构造函数是用于初始化对象的函数,在创建对象时自动调用。原创 2024-12-02 16:06:45 · 823 阅读 · 0 评论 -
Ubuntu 环境下的 C/C++ 编译与调试配置
本文档将手把手引导你完成在 Ubuntu 环境中设置 VS Code 的tasks.json和buildbuildtasks.jsong++将你的源代码放入src目录,例如创建一个简单的main.cpptasks.json。原创 2024-11-26 15:31:09 · 957 阅读 · 0 评论 -
getline
getline是 C++ 标准库中的一个函数,用于从输入流中读取一行文本。原创 2024-07-17 22:48:03 · 1831 阅读 · 0 评论 -
C++ 中的流操纵器(Stream Manipulators)
C++ 中的流操纵器(Stream Manipulators)是非常有用的工具,用于控制输入和输出流的格式和行为。下面是一些常见的流操纵器及其详细说明和使用示例。原创 2024-07-11 21:27:15 · 1149 阅读 · 0 评论 -
会改变流的关键字
这些关键字会改变流的行为。每个关键字都会影响输出流(如std::cout)的行为,确保输出按照预期的格式显示。原创 2024-07-11 21:12:58 · 266 阅读 · 0 评论 -
`flush` 和 `endl` 操纵器在 C++ 中的作用和原理。
flush用于在不换行的情况下强制刷新缓冲区,适用于需要实时显示数据但保持在同一行的情况。endl用于在插入换行符后刷新缓冲区,适用于需要换行并实时显示数据的情况。flush操纵器:用于强制刷新缓冲区,将数据立即输出,不插入任何字符。endl操纵器:用于插入一个换行符并刷新缓冲区,确保数据立即输出并换行。通过合理使用flush和endl,可以更好地控制数据的输出时机和格式,提高程序的实时性和可读性。原创 2024-07-11 21:12:11 · 972 阅读 · 0 评论 -
计算机流(Stream)
流是一种数据传输方式,它允许数据像流水一样在计算机的不同部分之间移动。可以将它比作水管中的水流,通过管道从一个地方流向另一个地方。流可以是输入流(例如从键盘输入数据到程序)或输出流(例如将数据从程序输出到屏幕)。位是计算机中最小的数据单位,可以是0或1。这就像是一个开关,只有开(1)或关(0)两种状态。多个位可以组成字节,表示更多的信息。缓冲区是一个临时存储区域,用于在数据传输过程中平衡速度差异。原创 2024-07-11 19:37:51 · 647 阅读 · 0 评论 -
C++ 标准库中的异常类
类表示逻辑上的错误,通常是可以通过修复代码来避免的错误。: 表示参数超出函数定义域。: 表示传递了无效参数。: 表示长度错误,通常是容器超出了其最大大小。: 表示访问超出了容器的有效范围。类表示运行时错误,通常是无法通过修改代码避免的错误。: 表示算术运算导致的溢出错误。: 表示算术运算导致的下溢错误。原创 2024-07-11 19:34:43 · 960 阅读 · 0 评论 -
C++的智能指针
智能指针是C++中用于自动管理动态分配内存的对象,它通过包装原始指针,提供了类似指针的接口,并在适当的时候自动释放内存,从而帮助避免内存泄露。C++标准库提供了几种智能指针,其中最常用的是和。原创 2024-04-13 10:59:02 · 807 阅读 · 0 评论 -
C++的排序
std::sort允许你通过自定义比较函数来指定排序顺序,这在处理复杂数据结构时特别有用。比如,如果你有一个存储人员信息的vector,每个人都有姓名和年龄属性,你可能想要根据年龄来排序这个列表。int age;// 构造函数// 比较函数return 0;原创 2024-04-11 21:52:18 · 1771 阅读 · 1 评论 -
C++ 运算符与重载
运算符重载是 C++ 中的一种特性,它允许我们为自定义类型定义运算符的行为。这意味着你可以对你自己创建的类使用诸如等运算符,并定义它们对你的类对象进行操作时应该做什么。让我们通过一个简单的例子来理解运算符重载:创建一个Vector2D类,它表示二维空间中的向量,并重载加法运算符来实现两个向量的相加。在这个例子中,我们定义了一个表示二维向量的类Vector2D,并重载了两个运算符:加法运算符:它允许我们通过简单地使用符号来将两个Vector2D对象相加。这个运算符函数接受一个Vector2D。原创 2024-04-09 14:35:24 · 861 阅读 · 0 评论 -
C++ 隐式转换和explicit关键字
像是你对音箱说:“播放音乐。在 C++ 中,当你有一个只需要一个参数的构造函数时,编译器会自动“理解”你想如何转换类型。比如,如果你有一个表示数字的类,当你给它一个整数时,编译器会自动创建这个类的对象,就像音箱自动理解命令一样。这有时可能导致意外的行为,特别是在构造函数只有一个参数时,它可以被用来隐式转换为类类型。关键字,意味着当你想用一个值来创建对象时,你需要明确地告诉编译器你的意图,编译器不会自动为你做类型转换。关键字用来防止编译器自作主张地为你做出可能不是你想要的决定,它要求你必须明确你的意图。原创 2024-04-09 14:32:59 · 515 阅读 · 0 评论 -
C++ new关键字
它不仅分配了内存,还调用了对象的构造函数来初始化对象。这里有一个简单的示例,说明如何使用。这行代码在堆上分配了一个具有5个整数的数组。在创建基本数据类型数组时,不会调用构造函数,因为基本数据类型没有构造函数。)来管理动态分配的内存,因为智能指针能够帮助我们自动释放内存,从而避免内存泄露。这是现代C++的一个最佳实践。在实际的C++项目中,我们通常推荐使用智能指针(如。返回的是指向该对象的指针。如果你创建的是一个对象,使用。如果你创建的是一个数组,需要使用。这行代码在堆上分配内存来存储一个。原创 2024-04-09 14:32:09 · 357 阅读 · 0 评论 -
C++创建并初始化对象
在 C++ 中,可以在堆(也称为自由存储区)或栈上创建和初始化对象。这两种分配内存的方法具有不同的生命周期和管理方式。记住,在使用堆时必须谨慎管理内存,以避免内存泄漏。在现代 C++ 编程中,通常推荐使用智能指针(如。)来自动管理堆内存。原创 2024-04-09 14:31:25 · 334 阅读 · 0 评论 -
C++的成员初始化列表
在 C++ 中,成员初始化列表是用于初始化类对象成员的语法结构,它在对象的构造函数中使用。)之后使用成员初始化列表进行初始化。这种方式比在构造函数体内部分配值更加高效,并且对于。这些成员通过在构造函数后的冒号(和引用成员是必须的。的一个实例,并调用了。原创 2024-04-09 14:29:23 · 370 阅读 · 0 评论 -
C++中的mutable
关键字是用来说明即使一个对象是常量,对象内的某个成员变量也可以被修改。通常,这个关键字用于类的成员变量。让我给你一个简单的例子来说明这个概念。方法,也不能修改它的任何成员变量。在上面的代码中,如果你尝试取消注释。,你会得到一个编译错误,因为。可以被调用,并且它可以修改。方法中,你仍然可以修改。函数中,我们创建了一个。方法,它仍然可以调用。原创 2024-04-09 14:27:22 · 431 阅读 · 0 评论 -
C++中的const
const是C++中一个非常有用的特性,它提供了多层次的保护,确保数据不会被意外修改,同时也使得代码更加清晰、安全和易于维护。掌握const的使用,能够让你写出更加健壮的C++代码。原创 2024-04-09 14:22:41 · 801 阅读 · 0 评论 -
C++中的数组
栈内存的分配和释放是自动管理的,当数组的生命周期结束时(例如,声明它的函数返回时),内存会自动被释放。这种方式简单且快速,但由于栈的大小有限,它不适用于大量数据的存储,且数组的大小在编译时必须是已知的。图书管理员会去库房(堆内存)找到一个合适的书架给你,并告诉你书架的位置(返回一个指向书架的指针)。使用这种方法,由于内存是在运行时分配的,可以根据程序的需要动态决定数组的大小。:简单方便,但书架的大小是固定的,且你不能把书架带走(函数结束就释放了)。释放它),图书管理员才会收回书架,让其他人使用。原创 2024-04-04 15:08:36 · 375 阅读 · 1 评论 -
C++接口(纯虚函数)
通过这个比喻,希望你能更好地理解C++中接口(纯虚函数)的概念:它们定义了一组接口,任何继承这些接口的类都必须实现这些接口中的方法。一个包含纯虚函数的类不能被实例化,它必须由其他类继承并实现所有的纯虚函数,这些派生类才能被实例化。通过这个例子,你可以看到C++中通过纯虚函数定义接口的方式,以及如何通过派生类来实现这些接口。在C++中,接口可以通过定义一个包含纯虚函数的抽象类来实现。下面是一个简单的例子,来说明C++中如何使用纯虚函数来定义接口,并如何由其他类来实现这个接口。的抽象基类,它包含一个纯虚函数。原创 2024-04-04 15:01:17 · 568 阅读 · 0 评论 -
C++虚函数
虚函数在C++中用于实现多态,它允许子类重写父类的方法。当通过父类指针或引用调用一个虚函数时,会根据对象的实际类型来调用对应的函数,这就是多态的体现。想象我们在做一个动物园的软件,我们想让每种动物发出自己的叫声。在C++中,我们可以使用虚函数来实现这一点,这样不同的动物就可以有不同的实现方式了。通过这个示例,你可以看到虚函数如何允许在运行时根据对象的实际类型调用相应的函数。,这个函数用来输出动物的叫声。是一个虚函数,所以实际调用的是指针所指对象的类型的。用一个更简单易懂的例子来解释虚函数的作用吧!原创 2024-04-04 14:59:49 · 271 阅读 · 0 评论 -
C++的引用
在C++中,引用可以被看作是变量的另一个名字(别名)。引用必须在声明时被初始化,并且一旦被初始化绑定到一个变量,就不能改变绑定到另一个变量。引用在C++中非常有用,特别是在函数参数传递和返回值时,因为它们允许直接操作传递给函数的对象,而不是操作对象的副本。这样可以提高效率并允许函数修改传递给它的参数。原创 2024-04-04 14:53:49 · 204 阅读 · 1 评论 -
C++实现单例模式
静态成员函数可以在没有创建类的实例的情况下被调用。这对于实现单例模式非常重要,因为单例模式的目标是控制对象的创建,确保整个程序中只创建一个实例。,我们确保了这个类的实例只会被创建一次。静态局部变量的初始化仅在第一次访问函数时进行,之后的访问会返回同一个实例。函数的设计确保了这个类遵循单例模式的要求,即整个程序中只有一个该类的实例,且易于从任何地方访问这个实例。使用引用的原因是我们希望直接返回单例对象本身,而不是它的一个副本。类型的引用,并且这个函数本身也被声明为。,意味着返回的是一个对。原创 2024-04-04 14:55:50 · 297 阅读 · 0 评论
分享