C++
文章平均质量分 66
繁星意未平
记录我的计算机学习之路,分享计算机专业知识,领悟计算机实践之道。
展开
-
使用C++和Crypto++库进行加密解密
Crypto++是一款高度认可的免费C++类库,它包含了广泛的密码学算法实现,包括但不限于AES和SHA-1。我们的讨论将重点放在构建一个强大的AES加密解密类结构上,同时充分利用Crypto++库的强大功能。这种设计遵循了策略模式的思想,它为运行时切换加密和解密的具体实现提供了灵活性。PBKDF2是一种基于密码的密钥导出函数,其核心优势在于其高计算复杂度,这显著增加了抵御暴力破解攻击的难度。这种模式不仅提升了代码的可维护性,还有效地隔离了接口变更对实现的影响,是现代C++设计中的一种常见而有效的实践。原创 2024-01-25 16:46:26 · 709 阅读 · 0 评论 -
标准库容器概述
应该是您的默认容器!实践中,在现代 CPU 上由于内存和缓存的工作方式,以及对于。,您首先需要迭代到您想要插入或删除元素的位置,所以。的内存可能是碎片化的,因此迭代比。中的插入和删除操作通常比。原创 2024-01-20 15:26:40 · 440 阅读 · 0 评论 -
掌握C++20的革命性特性:Concepts
标准库定义了一系列预定义的 Concepts,分为多个类别。以下列表给出了每个类别中的一些示例 Concepts,所有这些都在头文件和std核心语言 Conceptssame_asintegral等。比较 Concepts等。对象 Conceptsmovablecopyable等。可调用 Conceptsinvocablepredicate等。此外,头文件定义了与迭代器相关的 Concepts,如等,还定义了算法要求,如mergeablesortable。原创 2024-01-19 00:33:14 · 1301 阅读 · 0 评论 -
C++ Module详解,模块化编程终极指南
模块接口文件定义了模块所提供功能的接口。这些文件通常具有.cppm扩展名。模块接口以声明文件定义了某个名称的模块开始,这被称为模块声明。模块的名称可以是任何有效的 C++ 标识符。名称可以包含点,但不能以点开头或结尾,也不能连续包含多个点。有效名称的示例包括datamodel等。:目前,还没有为模块接口文件标准化的扩展名。然而,大多数编译器支持.cppm(C++ 模块)扩展名,这也是本书所使用的。请检查你的编译器文档,了解应使用哪种扩展名。原创 2023-12-24 18:43:27 · 1470 阅读 · 0 评论 -
C++函数模板详解,轻松实现通用函数
与类模板方法定义一样,函数模板的定义(不仅仅是原型)必须对使用它们的所有源文件可用。因此,如果多个源文件使用它们,您应该将定义放在模块接口文件中并导出它们。最后,函数模板的模板参数可以像类模板一样有默认值。注意:C++ 标准库提供了一个比这里展示的Find()函数模板更强大的函数模板。原创 2023-12-23 22:22:31 · 927 阅读 · 0 评论 -
C++类模板特化与继承使用说明书,新手也能get
你可以为特定类型提供类模板的替代实现。例如,你可能认为类型(C 风格字符串)的 Grid 行为没有意义。将在中存储其元素。拷贝构造函数和赋值运算符将执行这些指针类型的浅拷贝。对于,进行深拷贝字符串可能更有意义。最简单的解决方案是为编写一个专门的实现,将它们转换为 C++ 字符串,并存储在中。模板的替代实现称为模板特化。你可能会发现其语法初看有些奇怪。当你编写类模板特化时,你必须指定这是模板,并且你正在为特定类型编写模板的版本。以下是Grid的特化的语法。原创 2023-12-19 22:44:05 · 882 阅读 · 0 评论 -
掌握C++模板的艺术:类型参数、默认值和自动推导
您也可以编写自己的用户定义推导指南来帮助编译器。这些指南允许您编写模板参数如何被推导的规则。这是一个高级主题,所以不会详细讨论,但会给出一个示例来展示它们的强大功能。假设您有以下public:private:使用自动模板参数推导,您可以创建一个类型的" };然而,如果您将传递给构造函数,则类型T被推导为,这不是您想要的!您可以创建以下用户定义的推导指南,当向构造函数传递作为参数时,使其将T推导为这个指南必须在类定义之外但在与类相同的命名空间内定义。通用语法如下。explicit。原创 2023-12-13 19:08:38 · 976 阅读 · 0 评论 -
C++模板背后的黑箱操作:编译器
你可以将方法定义直接放在定义类模板本身的模块接口文件中。当你在另一个源文件中导入这个模块以使用模板时,编译器将能够访问它所需的所有代码。这种机制用于之前的Grid实现。或者,你可以将类模板方法定义放在一个单独的模块接口分区文件中。然后,你还需要将类模板定义放在自己的分区中。例如,Grid这导入并导出了两个模块分区:定义(definition)和实现(implementation)。方法的实现位于实现分区中,该分区还需要导入定义分区,因为它需要Grid...原创 2023-12-06 20:38:58 · 757 阅读 · 0 评论 -
C++模板基础及代码实战
类模板定义了一个类,其中一些变量的类型、方法的返回类型和/或方法的参数被指定为模板参数。类模板主要用于容器,即存储对象的数据结构。这一节通过运行示例Grid容器来说明。为了保持示例的合理长度并足够简单以阐明特定要点,本章的不同部分将为Grid容器添加不在后续部分使用的功能。为了理解类模板,检查其语法非常有帮助。以下示例展示了如何将GameBoard类修改为模板化的Grid类。代码后面会详细解释语法。请注意,类名已从GameBoard改为Grid。每个Grid模板的方法定义都必须以说明符开头。注意。原创 2023-12-05 22:52:06 · 929 阅读 · 0 评论 -
C语言变长参数及其陷阱
这部分解释了旧的 C 风格变长参数列表。了解这些内容很重要,因为你可能会在遗留代码中遇到它们。然而,在新代码中,你应该使用变参模板来实现类型安全的变长参数列表。考虑 C 函数printf(),来自。C/C++ 提供了语法和一些实用宏,用于编写你自己的变长参数函数。这些函数通常看起来很像printf()。尽管你不经常需要这个特性,但偶尔你会遇到它相当有用的情况。原创 2023-12-04 16:12:06 · 405 阅读 · 0 评论 -
小心处理 C++ 静态变量中的陷阱
static。原创 2023-12-03 21:36:00 · 437 阅读 · 0 评论 -
C++ 20类型转换指南:使用场景与最佳实践
情境推荐的转换方法说明移除const属性用于移除对象的const属性语言直接支持的显式转换例如,从int转换到double或bool用户定义的构造函数或转换支持的显式转换用于用户定义的转换一个类的对象转换为另一个(无关)类的对象bit_cast()用于无关类之间的对象转换同一继承层次中的类的指针对象转换(推荐) 或用于继承层次中的指针对象转换同一继承层次中的类的引用对象转换(推荐) 或用于继承层次中的引用对象转换不相关类型的指针转换用于完全不相关的指针类型之间的转换不相关类型的引用转换。原创 2023-11-19 20:33:36 · 135 阅读 · 0 评论 -
C++ 20类型转换指南:使用场景与最佳实践
情境推荐的转换方法说明移除const属性用于移除对象的const属性语言直接支持的显式转换例如,从int转换到double或bool用户定义的构造函数或转换支持的显式转换用于用户定义的转换一个类的对象转换为另一个(无关)类的对象bit_cast()用于无关类之间的对象转换同一继承层次中的类的指针对象转换(推荐) 或用于继承层次中的指针对象转换同一继承层次中的类的引用对象转换(推荐) 或用于继承层次中的引用对象转换不相关类型的指针转换用于完全不相关的指针类型之间的转换不相关类型的引用转换。原创 2023-11-18 16:25:27 · 114 阅读 · 0 评论 -
C++高级编程:构建高效稳定接口与深入对象设计技巧
类是C++中的主要抽象单位。你应该将抽象原则应用于你的类,尽可能将接口与实现分离。具体来说,你应该使所有数据成员私有,并可选择性地提供getter和setter方法。这就是SpreadsheetCell类的实现方式:m_value是私有的,而公共的set()方法设置值,getValue()和getString()方法检索值。原创 2023-11-11 21:00:53 · 305 阅读 · 0 评论 -
C++中低级内存操作
在你将遇到的99%(有人可能会说100%)的情况中,C++中的内置内存分配功能是足够的。在幕后,new和delete完成了以适当大小的块分配内存、维护可用内存区域列表以及在删除时将内存块释放回该列表的所有工作。但是,当资源约束非常紧张,或者在非常特殊的条件下,例如管理共享内存,实施自定义内存管理可能是一个可行的选项。不用担心,这并不像听起来那么可怕。基本上,自己管理内存意味着类会分配一大块内存,并根据需要将该内存分配出去。这种方法有什么好处呢?管理自己的内存可能会减少开销。当你使用new。原创 2023-10-26 20:03:28 · 180 阅读 · 0 评论 -
C++并发编程:构建线程安全队列(第二部分:细粒度锁)
使用多把锁和条件变量可以减少锁冲突,提供多个并发访问接口智能指针帮助简化内存管理通过标准库构建的线程安全队列,可以直接应用于多线程程序中上面这个线程安全队列利用C++11特性设计了一个实用的多线程数据结构,既保证了线程安全,也提供了良好的并发性能。关键技术点包括互斥量、条件变量、智能指针的使用,这些都是效实用的C++并发编程技能。原创 2023-09-05 16:01:04 · 327 阅读 · 0 评论 -
线程安全的队列:使用Monitor模式和C++11多线程库
在多线程编程中,数据共享是一个关键的问题。如果多个线程需要访问同一个数据结构,不正确的管理会导致数据不一致甚至程序崩溃。本文将介绍如何使用C++11的多线程库和Monitor模式来实现一个线程安全的队列。原创 2023-08-28 14:50:51 · 158 阅读 · 0 评论 -
C++ 23 实用工具(一)
工具函数是非常有价值的工具。它们不仅可以用于特定的领域,还可以应用于任意值和函数,甚至可以创建新的函数并将它们绑定到变量上。原创 2023-04-11 15:57:34 · 1438 阅读 · 0 评论 -
C++ 解引用运算符
在C++编程中,指针是一种非常重要的数据类型,它可以指向内存中的地址,让程序可以访问到变量或对象。指针的解引用运算符(*)是一个常见的操作符,在操作指针时非常常用。除此之外,C++中还有三种指向成员的指针,分别是::*.*和->*。本文将对这三种指针进行介绍,并提供相应的例子。::*是指向成员声明符的指针,可以用来绑定对象和成员函数。在这个例子中,我们定义了一个名为Rectangle的类,其中包含了成员变量w_和h_,以及一个计算面积的成员函数area()。原创 2023-04-09 22:28:15 · 1173 阅读 · 1 评论 -
C++ 设计模式 外观模式 The Facade Pattern
Facade Pattern 为一组复杂的子系统提供了一个统一的简单接口,它是一种结构型设计模式。它隐藏了子系统的复杂性,并向客户端提供了一个简单的接口来访问子系统。通过使用 Facade 模式,客户端可以方便地使用子系统,而不必了解子系统的内部细节。在 C++ 中,Facade 模式可以使用继承和组合的方式实现。Facade 类可以继承自 Subsystem 类,也可以包含一个 Subsystem 类的对象。原创 2023-01-29 15:51:05 · 219 阅读 · 0 评论 -
C++ 20 原子引用 (一)
类型对其引用的对象进行原子操作。使用进行多线程读写时不会造成数据争用。被引用对象的生命周期必须超过。操作的子对象是未定义行为。你可能认为在一个原子内使用引用可以实现这种操作,实际上不可以:最后的结果应该接近1500,所以出现了错误,原因是实际上创建了一个副本。接下来使用一个简单的示例演示一下:使用代替解决这个问题看到这里你可能会想为什么不把计数器最开始就定义成原子变量呢像这样:这确实是一个有效的方法,但是对原子变量的操作时同步的,使用可以让你显式的控制何时需要对原子变量进行原子访问,因为大多数时间原创 2023-01-10 22:53:06 · 724 阅读 · 0 评论 -
C++20 协程实现线程同步示例
【代码】C++20 协程 线程同步示例。原创 2022-10-02 17:23:02 · 517 阅读 · 0 评论 -
C++ 20 协程总结
所谓协程,即用户级线程,一种用于将异步代码同步化的编程机制,使得程序的执行流可以在多个并行事务之间切换但又不必承担切换带来的过高的性能损耗。当前很多的编程语言都内置协程特性或者有自己的协程库,如C/C++的libco、golang的goroutine等。而在实现机制上,又可以划分为有栈协程和无栈协程。原创 2022-09-29 20:18:31 · 914 阅读 · 1 评论 -
C++ 20 协程(三)
中的三个函数返回可等待体,,原创 2022-09-28 22:37:16 · 701 阅读 · 0 评论 -
C++ 20 协程(二)
协程句柄是一个非拥有的句柄,用于从外部恢复或销毁协程帧(frame)。协程句柄是可恢复函数的一部分。实现协程的框架包含了20多个函数,一些必须实现,一些必须重写,因此你可以定制协程的功能。是一个协程工厂返回一个协程对象。协程对象时一个可恢复对象,使用协程框架来指定他的行为。协程帧的关键是可等待体(**Awaitables **),等待器(一个函数成为一个协程,通过使用以下关键字中的一个。使用一个协程术语形容协程的两个方面会让人糊涂。,协程复制的参数,挂起点的表示,局部变量等。的函数,另一个是协程对象。原创 2022-09-28 15:08:49 · 802 阅读 · 0 评论 -
C++ 20 协程(一)
所谓协程,即用户级线程,一种用于将异步代码同步化的编程机制,使得程序的执行流可以在多个并行事务之间切换但又不必承担切换带来的过高的性能损耗。当前很多的编程语言都内置协程特性或者有自己的协程库,如C/C++的libco、golang的goroutine等。而在实现机制上,又可以划分为有栈协程和无栈协程。原创 2022-09-25 19:34:44 · 840 阅读 · 0 评论 -
哲学家干饭问题 C++
哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌上有五碗意大利面,每位哲学家之间各有一支餐叉。因为用一支餐叉很难吃到意大利面,所以假设哲学家必须用两支餐叉吃东西。他们只能使用自己左右手边的那两支餐叉。哲学家就餐问题有时也用米饭和五根筷子而不是意大利面和餐叉来描述,因为吃米饭必须用两根筷子。这个问题不考虑意大利面有多少,也不考虑哲学家的胃有多大。假设两者都是无限大。原创 2022-09-18 14:34:52 · 969 阅读 · 0 评论 -
C++ 20 并发编程 std::promise
std::promise和std::future是一对, 通过它们可以进行更加灵活的任务控制原创 2022-08-19 23:40:38 · 449 阅读 · 0 评论 -
C++ 20 线程安全的Map
C++ 线程安全查找表原创 2022-08-14 16:26:57 · 977 阅读 · 0 评论 -
C++20 Atomic 原子 内存模型(二)
原子操作默认使用顺序一致性标志。原创 2022-08-07 16:23:59 · 690 阅读 · 0 评论 -
C++ 20 内存模型(一)
多线程的基础是优秀的内存模型。原创 2022-08-06 15:09:03 · 182 阅读 · 0 评论 -
PROJECT #1 - BUFFER POOL [CMU 15-445645]笔记
PROJECT #1 - BUFFER POOL 15-445/645笔记原创 2022-06-28 22:05:48 · 406 阅读 · 0 评论 -
容器和算法的改进 --- C++20
对容器和算法有很多的改进这样, 你就可以实现在编译期查找字符串子串, 在编译期对数组进行排序之所以能容器能在编译期能实现这些操作, 是因为使用了瞬态分配 : 编译期申请的内存必须在编译期就释放, 不能将编译期申请的内存在运行时使用因为没有应用新的 , 所以需要像下面这样做C++ 20 之后其他容器也类似可以方便的判断容器是否包含一个元素比较长,并且对初学者不友好这样就非常的简单了std::shift_left, std::shift_right - C++中文 - API参考文档 (apir原创 2022-06-18 18:06:16 · 239 阅读 · 0 评论 -
PROJECT #0 - C++ PRIMER [CMU 15-445645]笔记
这是数据库领域的一门课程, 由卡内基梅隆大学副教授Andy Pavlo授课, 目前在网上有授课视频资料、实验以及配套的在线测评环境 (限时开放至2021年12月31日)环境: wsl2 + Clion还是很简单的,主要目的是让学生熟悉 C++17 的基本语法代码如下:x *matrixB,const RowMatrix *matrixC) {std::unique_ptr tempMat = std::move(Multiply(matrixA, matrixB));if (tempMat == n原创 2022-06-18 00:06:56 · 385 阅读 · 0 评论 -
Curiously Recurring Template Pattern奇怪的模板递归 --- C++20
我们都知道有静态多态和动态多态,动态多态通过虚函数表实现,他的缺点就是对效率产生一点点影响可以用解决这个问题我们先举一个动态多态的例子:会在运行时查找虚函数表,影响运行时效率特点:子类继承基类,且基类有一个模板参数,并以子类类型为参数每个基类都调用 然后调用这样就在编译器实现了多态,避免了动态多态Info;writeMessage(messInfo);}...原创 2022-06-18 00:03:37 · 155 阅读 · 0 评论 -
模板元编程(二) Template Metaprogramming ---C++ 20
现在我们介绍参数与模板参数混合使用先看一下例子:下面我们来看一个更好的例子:这个例子更加清晰明了既有中的函数参数也有中的模板参数,所以**同时是一个函数和元函数**深入了解一下,我们可以用模板参数实例化,并在循环中使用:可以使用这种方式计算每个数的平方不可以在循环中给可变的模板参数像这样:使用模板创建全新的类型每个模板实例化之后都会创建一个新的类型例如:前文的例子存在很多缺陷,比如传入传入一个不合适的数,运行时发生溢出第一个问题可以使用解决,第二个问题暂时没有好的解决办法但我们现在使用解决第一原创 2022-06-18 11:15:00 · 231 阅读 · 0 评论 -
模板元编程 Template Metaprogramming--- C++ 20
举个例子:在概念上应该这样实现(实际并不是这么做的):意义上,首先获取它的参数,推断出其类型,移除引用,最后转换为右值引用,移动语义就生效了.如何移除参数的呢?等同,其中表示编译器推断出来的模板类型传入时,应用传入,应用,这样就移除了,很好理解是编译阶段元函数使用的数据一共有三种类型:以后会详细解释这部分内容元函数是在编译期执行的函数元函数:函数 vs 元函数参数:函数的参数在圆括号里面,元函数的参数在尖括号里面返回值:函数返回一个语句,元函数返回一个静态常量值以后会介绍和例子:下一篇文章介绍:原创 2022-06-18 08:30:00 · 374 阅读 · 0 评论 -
类型萃取类型检查 Type-Traits LibraryType Checks --- C++20
Type-Traits library 在的时候就已经发布,但依然随着C++版本在不断更新每种类型就是十四种主要类型之一例子:让我们试着实验一下这个魔法作为返回值,这是元函数的命名约定自从C++17之后,有了一个更便捷的方式:这样可以使用代替Composite data type - Wikipedia对于主要类型和复合类型,类型萃取库提供类型属性和类型属性查询类型属性查询template struct has_virtual_destructor;template struct has_原创 2022-06-18 06:30:00 · 159 阅读 · 0 评论 -
类型萃取类型比较 Type-Traits Librarytype comparisons --- C++20
不涉及只在编译期 支持三种类型:新加了几种:检查一个类型的对象是否与该类型的指定对象指针可互转换检查一个类型的对象是否与该类型的指定子对象指针可互转换std::is_pointer_interconvertible_with_class - cppreference.com调用函数模板就是调用模板函数,因为忽略和版本使用移除和这东西好难,智商太低…最全C++11/14/17/20/23 的新特性代码案例 - 知乎 (zhihu.com)The Type-Traits Library: Type原创 2022-06-19 03:15:00 · 89 阅读 · 0 评论 -
可变参数模板(参考《C++ Templates 英文版第二版》)
自从C++11,模板可以接受可变数量的参数可以定义模板,去接受无限数量的模板参数这种行为的模板叫做可变参数模板4.1.3 运算符C++11 之后,操作符对于可变参数模板有新的用法,他返回参数包里面包含多少个元素4.2 折叠表达式C++11 提供了可变模板参数包, 使函数可以接受任意数量的参数. 但在 C++11中展开参数包稍显麻烦, 而 C++17 的折叠表达式使得展开参数包变得容易,其基本语法是使用 的语法形式进行展开.折叠表达式支持 32 个操作符: , , , , , , , , , ,,原创 2022-06-18 00:00:50 · 95 阅读 · 0 评论