![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 61
陈庆之的论衡
这个作者很懒,什么都没留下…
展开
-
c++20 的部分新概念及示例代码-Contracts,Ranges
C++20 引入了 contracts(契约),这是一种编程范式,它允许程序员在代码中添加先决条件(preconditions)、后置条件(postconditions)和断言(assertions)等契约,以提高代码的可读性、可维护性和可靠性。Ranges 库,它提供了一组用于操作范围(例如容器、数组、迭代器等)的标准库组件,以更简洁、清晰和高效地处理数据。:Ranges 库引入了一些新的迭代器概念,如输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器等,以支持不同类型范围的操作。原创 2024-04-01 15:34:22 · 825 阅读 · 0 评论 -
c++20 的部分新概念及示例代码-concepts,<=>,init-capture extension,coroutines
c++20 概念,三路比较符,初始化捕获,协程原创 2024-03-27 17:04:04 · 424 阅读 · 0 评论 -
c++ 关于共享指针在数组中的所有权转移
可以看到,在清空源 vector 后,目标 vector 仍然保留了原始。使用引用计数的方式来管理资源的生命周期,在没有其他持有者时自动释放资源。所管理的资源引用计数降为零时,资源会被释放。对象没有其他地方持有,它们的资源将会被释放。的所有权会发生变化。的资源,并正常进行了释放。以下是一个示例代码,展示了如何插入。对象所管理的资源会被转移给目标。对象会失去对资源的所有权。原创 2023-12-25 14:07:11 · 444 阅读 · 0 评论 -
C++ Core Guidelines 中文版 GSL
C++ GSL(Guideline Support Library)是由 Microsoft 开发的一个开源库,旨在提供一组通用的 C++ 标准库扩展,以支持 C++ 标准委员会提出的指导原则。GSL 为 C++ 开发人员提供了许多有用的工具和类型,以帮助他们编写更安全、更高效的代码。:GSL 包括用于执行数组边界检查、迭代器有效性检查等的工具。这有助于避免数组越界访问和迭代器失效等问题。:GSL 提供了类型,用于表示指针或引用不能为空,从而帮助避免空指针异常。原创 2023-11-14 10:41:05 · 906 阅读 · 0 评论 -
C++ Core Guidelines 中文版 Introduction 简介
这是一套现代C++(目前为C++20和C++17)的核心准则,同时考虑到未来可能的增强和ISO技术规范(TS)。目的是帮助C++程序员编写更简单、更高效、更易于维护的代码。原创 2023-11-10 15:58:56 · 542 阅读 · 0 评论 -
C++ Core Guidelines 中文版 Abstract 摘要
我们所说的“现代C++”是指有效使用ISO C++标准(目前是C++20,但我们几乎所有的建议也适用于C++17、C++14和C++11)。遵循这些规则将导致静态类型安全的代码,没有资源泄漏,并捕获比当今代码中常见的更多的编程逻辑错误。你会发现一些规则与你的期望相反,甚至与你的经验背道而驰。特别是,我们真的希望用测量或更好的示例来支持我们的一些规则。思考这些指南的一种方式是作为人类恰好可读的工具的规范。我们还需要更多的规则。随着我们对理解的提高以及语言和可用图书馆集的改进,我们计划修改和扩展本文档。翻译 2023-11-10 15:21:09 · 235 阅读 · 0 评论 -
c++ 实现广度优先搜索
广度优先搜索(BFS)是一种用于遍历图或树的算法,它从一个起始节点开始,按照距离的顺序逐层遍历每个邻居节点,直到遍历完整个图或树。在C++中实现BFS可以使用队列数据结构来实现。原创 2023-10-31 15:20:29 · 196 阅读 · 0 评论 -
c++ 深度优先搜索
深度优先搜索(DFS)是一种用于遍历图或树的算法,它从一个起始节点开始,递归地遍历每个邻居节点,直到没有未访问的节点为止。在C++中实现DFS可以使用递归或堆栈数据结构来实现。其中,第一行是递归实现的DFS遍历结果,第二行是使用堆栈实现的DFS遍历结果。原创 2023-10-31 15:12:52 · 106 阅读 · 0 评论 -
c++实现迪杰斯特拉算法
需要注意的是,迪杰斯特拉算法只适用于边权重为非负数的情况。迪杰斯特拉算法的时间复杂度为O(|V|^2),其中|V|为节点数。如果使用堆优化的实现方式,时间复杂度可以降至O(|E|+|V|log|V|),其中|E|为边数。更新距离:对于与当前节点相邻的节点,计算从起点到这些节点的距离,并更新它们的距离值。如果新的距离值比原来的距离值更小,则更新距离值。初始化:将起点的距离设置为0,将其他节点的距离设置为无穷大。选择节点:从未访问的节点中选择距离起点最近的节点,将其标记为已访问状态。原创 2023-10-24 15:52:06 · 888 阅读 · 1 评论 -
c++实现哈夫曼编码的说明和实现
注意,由于哈夫曼树的性质,任何一个字符的编码都不是另一个字符编码的前缀,这被称为“前缀码”。哈夫曼编码是一种用于数据压缩的编码方法,它根据字符出现的频率来构建一棵二叉树,并将频率较高的字符赋予较短的编码,频率较低的字符赋予较长的编码。这是因为频率较高的字符被赋予较短的编码,而频率较低的字符被赋予较长的编码,从而使得整体的编码长度最小化。唯一编码:通过构建的哈夫曼树,每个字符都有唯一的编码。这是因为在哈夫曼树中,每个字符的编码都是通过不同的路径得到的,而路径上的0和1是不重复的。原创 2023-10-24 15:26:35 · 153 阅读 · 0 评论 -
c++ 模版元编程-SFINAE(Substitution Failure Is Not An Error)技术
通过合理使用SFINAE技术,可以实现一些高级的模板元编程技巧,比如根据类型是否具有某种成员函数来选择不同的模板实现,或者根据类型是否满足某些条件来进行函数重载等。当使用模板进行类型推导时,C++编译器会尝试对所有可行的候选函数进行匹配,并选择最佳的匹配结果。SFINAE技术的作用就是在编译器遇到错误时,将错误视为普通的“替代失败”,从而继续尝试其他候选函数的匹配。是否为整数类型的条件,如果为真,则选择第一个函数模板,否则选择第二个函数模板。是否为指针类型或类类型的条件,根据不同的条件选择不同的特化实现。原创 2023-09-27 10:25:04 · 242 阅读 · 0 评论 -
c++模版元编程,基于递归的编程
基于递归的模版元编程允许在模版中进行递归调用,以便在编译时生成更复杂的代码。这种技术的核心思想是将问题分解为一个个较小的子问题,并通过递归地调用模版来处理它们。基于递归的模版元编程在C++中可以实现很多复杂的算法和数据结构。它可以用于生成高效的代码,避免运行时开销,并在一定程度上提高程序的性能。模版结构体,它通过递归地调用自身来计算斐波那契数列的值。模版结构体的特化用于处理基准情况(斐波那契数列的前两个元素)。来计算斐波那契数列的第10个元素,并将结果输出到控制台。在上述示例中,定义了一个。原创 2023-09-26 11:25:08 · 136 阅读 · 0 评论 -
c++ 模版元编程 基于条件的编译
基于条件的编译是指根据不同的条件选择是否编译某段代码或选择不同的代码路径。在 C++ 的模板元编程中,我们可以利用模板特化和技术来实现基于条件的编译。通过基于条件的编译,我们可以在编译期间根据类型特征或其他条件,决定采取不同的代码路径。这种能力使得我们可以针对不同类型或条件编写更加灵活和通用的代码。原创 2023-09-21 17:34:53 · 260 阅读 · 0 评论 -
c++模版元编程-可变参数模版
在 C++ 中,我们可以使用模板参数包(Template Parameter Pack)和展开表达式(Expanding Expression)来定义可变参数模板。原创 2023-09-20 15:12:45 · 106 阅读 · 0 评论 -
c++模版元编程-类模版
类模板是一种通用的类定义,其中的成员函数和成员变量的类型不是具体的类型,而是参数化的类型。类模板将模板参数作为类型参数,允许在编译时根据不同的类型生成不同的类。原创 2023-09-19 16:32:03 · 105 阅读 · 0 评论 -
c++模版元编程-函数模版
函数模板的定义: 函数模板的定义使用关键字template,后接模板参数列表和函数原型。模板参数列表可以包括类型参数、非类型参数或模板参数包。返回类型 函数名(参数列表)// 函数体typename或class关键字用于声明类型参数。例如,typename T定义了一个类型参数T。模板参数可以在函数原型中使用,作为函数的形参类型或返回类型的一部分。类内函数模板允许在类定义内部声明和定义函数模板,使得模板与类紧密关联,方便使用类的成员变量和成员函数。原创 2023-09-18 10:26:43 · 135 阅读 · 0 评论 -
C++线程池模式
1 简介: 线程池是一种常用的并发设计模式,用于管理和调度多个线程进行任务处理。线程池通过预先创建一组线程,并维护一个任务队列,从任务队列中获取任务并分配给空闲的线程执行,以提高系统的性能和资源利用率。上述代码中,客户端可以创建线程池对象并将任务添加到线程池中,线程池会自动调度线程执行任务。a. 定义任务类:首先,定义一个任务类,该类包含待执行的任务逻辑和数据。b. 实现线程池类:创建一个线程池类,该类包含线程池的管理和调度逻辑。原创 2023-08-16 15:59:02 · 63 阅读 · 0 评论 -
C++策略模式
它将算法封装成一个个具体的策略类,并使这些策略类可以相互替换,以达到动态改变对象的行为的目的。c. 创建环境类:创建一个环境类,用于保存当前使用的策略对象,并且提供一个方法来改变策略对象。上述代码中,客户端可以根据需求选择不同的具体策略来执行算法,通过改变策略对象,动态地改变行为。b. 实现具体策略类:创建实现策略接口的具体策略类,每个具体策略类都实现了算法方法。a. 定义策略接口:首先,定义一个策略接口,该接口声明了策略类中的算法方法。原创 2023-08-16 15:47:08 · 2049 阅读 · 0 评论 -
C++适配器模式
1 简介: 适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端所期望的另一个接口。适配器模式允许不兼容的类能够协同工作,通过适配器类来实现接口的转换和适配。上述代码中,客户端通过适配器来调用目标接口的方法,实际上适配器内部会调用适配者类的特定方法。c. 创建适配器类:定义适配器类,继承目标接口,并在适配器类中持有适配者类的实例。a. 定义目标接口:首先,确定客户端所期望的目标接口,即需要适配的接口。b. 实现适配者类:创建实现了适配者接口的类,该类是客户端需要适配的类。原创 2023-08-16 15:37:24 · 557 阅读 · 0 评论 -
C++工厂方法模式
1 简介: 工厂方法模式是一种创建型设计模式,用于通过一个公共接口来创建具体对象,而无需在客户端代码中显式指定其具体类。d. 实现具体工厂类:创建具体工厂类来实现工厂接口,根据客户端的请求创建相应的产品。上述代码中,客户端使用不同的具体工厂来创建不同的产品,并调用产品的操作方法。a. 定义产品接口:首先,定义一个产品接口,该接口声明了产品类的公共方法。c. 定义工厂接口:创建一个工厂接口,声明用于创建产品的工厂方法。b. 实现具体产品类:创建实现产品接口的具体产品类。原创 2023-08-16 15:17:38 · 268 阅读 · 0 评论 -
心跳功能:c++
是计算机系统、网络设备或软件应用程序中的一种监测机制,用于定期检测系统或设备的运行状态以及与其它组件之间的连接是否正常。它模拟人类心跳的概念,定期发送信号来确认系统的活动状态。心跳信号是一个小型的数据包或请求,用于发送给要监测的系统或设备。这个信号可以是一个简单的网络请求、ping 指令、或者自定义的应用层数据包。实际上,心跳功能的实现方式因系统的类型和需求而异。当心跳信号不再收到或连接丢失时,可以根据系统的需求来执行一系列操作。要监测的系统或设备需要实现一个接收机制,来接收并处理来自发送方的心跳信号。原创 2023-08-16 11:46:23 · 432 阅读 · 0 评论 -
c++库 Android调用
请注意,在封装C++库供Android调用时,您需要熟悉C++编程、Java编程和JNI的基本概念。使用JNI接口:在您的Android应用程序代码中,使用JNI接口调用C++库函数。您可以在Java代码中编写调用JNI接口的逻辑,从而实现与C++库的交互。创建一个新的Android项目并设置C++支持:在Android Studio中创建一个新的Android项目,并选择包含C++支持的选项。将C++库添加到项目中:将您的C++库源码文件(.cpp和.h文件)添加到项目的C++目录中。原创 2023-08-11 17:28:51 · 660 阅读 · 0 评论 -
c++:命令行参数
Google开源的C++库gflags(也称为Google Flags)是一个用于处理命令行参数(flags)的库,它旨在帮助开发人员轻松定义、解析和管理程序的命令行参数。gflags库提供了一种方便的方式来处理程序的配置选项,使得程序的配置更加灵活和易于管理。这会将标志的值设置为相应的参数值,然后程序会输出相应的信息。:除了命令行参数,gflags还支持通过环境变量来设置标志的值,这为程序配置提供了更多的灵活性。:gflags库可以自动生成命令行帮助信息,以便用户在使用程序时了解可用的命令行选项和标志。原创 2023-08-07 12:14:41 · 277 阅读 · 0 评论 -
观察者模式
在这种模式中,一个主体对象(也称为主题或可观察者)维护一个列表,其中包含一组观察者对象。在客户端中使用观察者模式:创建观察者和主题对象,将观察者注册到主题上,并在需要的时候触发主题对象的通知方法。定义观察者接口(Observer Interface):创建一个纯虚类,定义观察者需要实现的方法,比如。创建具体主题类(Concrete Subject):实现主题接口,包含观察者列表,并在需要时通知观察者。创建具体观察者类(Concrete Observers):实现观察者接口,定义观察者的具体行为。原创 2023-08-04 13:57:26 · 40 阅读 · 0 评论 -
c++ 内存屏障
C++内存屏障(Memory Barrier)是一种同步原语,用于控制多线程环境下的内存访问顺序和可见性。它可以确保在某个点之前的所有内存访问操作完成后,该点之后的内存访问操作才能开始。需要注意的是,内存屏障只能确保特定点之前和之后的内存访问顺序和可见性,不能解决所有的并发问题。内存屏障在C++中通过使用一些特殊的函数或指令来实现。表示在这个点之前的所有内存写入操作都会在这个点之前变得可见。,可以确保在该操作之前的所有内存写入操作对于加载操作可见。的加载操作就能看到之前所做的存储操作。原创 2023-07-28 09:30:28 · 792 阅读 · 0 评论 -
C++ Map详细说明文档
下面是创建std::map对象的示例:cpp复制代码其中,KeyType是键的类型,ValueType是值的类型。可以根据实际需要自定义这两个类型。std::map提供了一个灵活而高效的关联容器,用于存储键值对。通过使用insert()[]find()和erase()等函数,可以实现元素的插入、访问、查找和删除操作。使用迭代器可以遍历std::map中的所有元素。这使得std::map成为处理键值对集合的有用工具。原创 2023-07-18 09:53:05 · 887 阅读 · 0 评论 -
C++ List详细说明文档
下面是创建std::list其中,是列表中元素的类型。可以根据实际需要自定义这个类型。std::list提供了一个高效的双向链表容器,用于存储元素。通过使用erase()和pop_back()等函数,可以实现元素的插入和删除操作。使用迭代器可以遍历std::list中的所有元素。这使得std::list成为处理需要频繁插入和删除操作的集合的有用工具。原创 2023-07-18 12:05:32 · 119 阅读 · 0 评论 -
c++ queue队列的分类和详解
C++中的queue(队列)是标准库提供的一种容器适配器,它基于先进先出(FIFO)的原则进行元素的插入和删除操作。队列在实际应用中广泛使用,例如任务调度、消息传递等场景。以上代码创建了一个整数队列,插入了三个元素1、2和3,并依次访问和删除队列头部的元素。最后,通过循环遍历打印队列中的元素。使用queue需要包含头文件,然后通过std命名空间来调用相应的类和函数。原创 2023-07-21 09:25:51 · 199 阅读 · 0 评论