
C++
文章平均质量分 69
赛先生.AI
科技公司CTO。机器学习,深度学习,计算机视觉从业者。网络,流媒体技术,编解码技术爱好者。
曾从事汽车行业,安防行业,现从事无人机行业。
-> tecsai@163.com
展开
-
设计模式 - 状态模式
状态模式作为设计模式的一种,主要用于根据状态的改变执行不同的动作,它允许一个对象在其内部状态改变时改变它的行为。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。原创 2024-08-13 16:19:28 · 692 阅读 · 0 评论 -
C++(27): 线程池
线程池技术绝不是C++独有的,Java和Python都有比较晚完善的线程池构造接口。通俗的讲,线程池只是一种管理线程的方式。很多时候,我们为了充分利用CPU和Memory资源,会创建一些独立的线程,执行同步或异步的任务。但有一个不得不考虑的问题是,现成的创建和销毁本身也是消耗系统资源的,尤其是一些需要频繁创建和销毁线程的应用场景下。当然有时候有一些连续的任务也不需要通过线程池技术来完成。如上所述,为了避免频繁创建和销毁线程带来的系统资源的消耗,我们可以提前创建一定数量的线程,用来等待和处理队列中的事原创 2024-08-13 16:15:26 · 581 阅读 · 0 评论 -
C++(26): 原子操作(std::atomic)
开发过多线程、并发编程的小伙伴一定接触过mutex,通过对资源进行加锁和解锁,实现对方问和修改的互斥操作。mutex使用起来很方便,很强大,但也有局限性。频繁地加锁和解锁会造成较大的资源消耗,影像系统的性能。 与mutex相比,原子(atomic)操作相对灵活和简单。 注意,这种灵活性在一定程度上是做了某些妥协的。原创 2024-06-21 11:43:19 · 1486 阅读 · 0 评论 -
C++(11): set与multiset
在C++标准模板库(STL)中,std::set是一个基于平衡二叉搜索树(通常是红黑树)的关联容器,它能够存储唯一的元素并保持这些元素按排序顺序。由于std::set内部通常使用红黑树(一种自平衡的二叉搜索树)来实现,所以保证高效的查找、插入和删除操作。multiset与set类似,都是基于红黑树的结构,不同的是,multiset允许存储多个值相同的元素。原创 2024-05-29 23:31:49 · 775 阅读 · 0 评论 -
C++(25): C++17探索:std::optional
std::optional是C++17标准引入的一个新的标准库组件。这是一个轻量级的容器,旨在以类型安全的方式包装可能为空的值。std::optional为处理可能缺失的数据提供了一种优雅而简洁的方法,这在以往通常需要使用专门的“存在”标志或复杂的错误处理机制。简单点讲,std::optional在使用上并不复杂,主要用来替代那些需要返回NULL,或以返回-1表示错误等的场合。这样做最直观的一个改进就是易读性增强了。原创 2024-05-28 08:28:07 · 369 阅读 · 0 评论 -
C++(24): C++17探索:std::variant的使用
std::variant是C++标准库中的一个模板类,它允许我们在一种类型安全的方式下存储多种类型的值。它的行为类似于C语言中的联合体(union),但提供了更多的类型安全性和功能。与C语言的联合体不同,std::variant跟踪其当前持有的类型,并确保在使用时不会出现未定义的行为。原创 2024-05-21 14:13:15 · 674 阅读 · 0 评论 -
C++(23): C++:STL中的时间库(std::chrono)
C++ STL库中的 chrono 是一个关于日期和时间的库,它提供了一套丰富、灵活且类型安全的API,用于测量和操作时间。chrono 库是C++11标准的一部分,它使得我们可以进行高精度的时间测量,以及执行基于时间点的算术操作。原创 2024-05-15 13:43:37 · 1344 阅读 · 0 评论 -
C++(22): C++:STL中的部分计算接口(std::accumulate、std::partial_sum等)
C++ STL库中的算法组件提供了大量用于操作序列的算法函数。这些函数通常以迭代器范围为操作对象,可以非常方便地对容器中的元素进行各种操作,而不需要写循环。下面我会详细介绍几个常用的算法函数,特别是accumulate,并提供相应的例程。 本文将简单介绍std::accumulate、std::sort、std::find、std::count、std::partial_sum等函数,并给出其使用例程。原创 2024-05-15 13:39:31 · 1353 阅读 · 0 评论 -
C++(21): C++:std::vector与std::deque比较
std::vector和std::deque都是C++标准库中的容器,它们有一些相似之处,但也有很多重要的区别。以下是它们的相同点和不同点,以及各自的优点。原创 2024-05-13 09:58:43 · 1086 阅读 · 0 评论 -
C++(20): C++:异常的抛出与捕获(throw, try-catch)
在C++中,异常捕获与处理是一个强大的错误处理机制,它允许程序在执行过程中遇到错误时,能够以一种更加结构化和控制良好的方式来处理这些错误。C++提供了try, catch, throw等关键字来实现这一功能。原创 2024-05-11 08:04:22 · 804 阅读 · 0 评论 -
C++(19): C++:std::string的使用
C++的 std::string 类是C++标准库中的一个非常重要的类,用于表示和操作字符串。std::string 提供了大量的成员函数,可以方便地对字符串进行各种操作,如连接、比较、查找、替换等。相比于C语言的字符数组,std::string 更加安全,易于使用,且功能更加强大。原创 2024-04-28 13:53:42 · 1499 阅读 · 0 评论 -
C++(18): C++:std::bind的使用
std::bind是C++11标准库中的一个功能强大的函数适配器,它可以将一个可调用对象(函数、函数指针、函数对象或者成员函数指针)与其参数绑定,生成一个新的可调用对象。这个新的可调用对象可以像普通函数一样被调用,但是其内部实际上执行的是我们绑定的原始可调用对象。 虽然在C++11之后引入了lambda表达式可以替代并实现std::bind的功能,但是我们在此还是做一下简单的介绍。原创 2024-04-27 16:26:33 · 703 阅读 · 0 评论 -
C++(17): C++:模板函数与模板类
泛型编程是一种编程风格,可以开发一套代码适应不同的数据类型。C++中,泛型编程是通过模板来实现的。模板是C++支持参数化多态的工具,使用模板可以使用户为类属类型(如数组的元素类型和容器的数据类型)编写通用的代码,然后再编写特定的类型来创建类属类型的特定实例。模板是一种对类型进行参数化的工具,通常有两种形式:模板函数和模板类。原创 2024-04-18 16:46:32 · 274 阅读 · 0 评论 -
C++(16): STL:函数对象(仿函数)
函数对象是“重载函数调用操作符”的类,由于其使用时类似于调用一个函数,所以也称作“仿函数”。 通俗来讲,就是我们构建一个类,在类的内部重载了“()”操作符,然后在使用的时候我们可以像调用函数一样来调用类的对象。 不同于普通的函数,函数对象可以拥有自己的状态。原创 2024-04-15 14:32:15 · 224 阅读 · 0 评论 -
C++(15): STL算法:排序(sort)
std::sort 是 C++ 标准库 中提供的一个函数,用于对容器(如数组、向量等)中的元素进行排序。它基于比较操作对元素进行排序,通常使用高效的排序算法,如快速排序、归并排序或堆排序等。 在实际应用中,std::sort 通常会根据输入数据的大小和特性自适应地选择一种合适的排序算法。例如,对于小型数据集,它可能会选择插入排序或选择排序等简单算法,因为这些算法在小规模数据上通常具有较低的常数因子。对于大型数据集,它可能会选择快速排序、归并排序或堆排序等更高效的算法原创 2024-04-11 15:58:33 · 1149 阅读 · 0 评论 -
C++(14): STL条件变量std::condition_variable
在C++的标准模板库(STL)中,std::condition_variable是一个非常重要的同步原语,用于在多线程编程中实现线程间的条件同步。它允许一个或多个线程等待某个条件成立,当条件成立时,等待的线程会被唤醒并继续执行。原创 2024-04-10 18:45:53 · 3959 阅读 · 0 评论 -
C++(10): std::map、std::multimap与std::unordered_map
std::map、std::multimap 和 std::unordered_map 是 C++ 标准模板库(STL)中的三种关联容器,它们提供了存储键值对(pair)的方式,并允许通过键来快速检索值。这三者之间的主要区别在于它们的内部数据结构和对元素的排序方式。原创 2024-04-07 10:48:45 · 1676 阅读 · 0 评论 -
C++(13): 智能指针shared_ptr
shared_ptr智能指针,本质是“离开作用域会自动调整(减小)引用计数,如果引用计数为0,则会调用析构函数”。这样一来,就进化成类似于int、float等的一种会被自动释放的类型。原创 2024-04-03 08:53:29 · 1741 阅读 · 0 评论 -
C++(12): std::mutex及其高级变种的使用
在多线程或其他许多场景下,同时对一个变量或一段资源进行读写操作是一个比较常见的过程,保证数据的一致性和防止竞态条件至关重要。C++的标准库中为我们提供了使用的互斥及锁对象,帮助我们实现资源的互斥操作。原创 2024-04-02 10:12:55 · 2238 阅读 · 0 评论 -
C++(9): std::stack的使用
std::stack 是 C++ 标准模板库(STL)中的一个容器适配器,它提供了后进先出(LIFO)的数据结构。作为适配器,std::stack 基于其他容器(默认是 std::deque,但也可以指定为 std::vector)来实现其功能。原创 2024-03-29 07:17:04 · 361 阅读 · 0 评论 -
C++(8): std::deque的使用
std::deque 是 C++ 标准库中的一个双端队列容器。这个容器支持在序列的两端进行快速的插入和删除操作,其时间复杂度为常数时间 O(1)。同时,std::deque 也提供了对序列中任意元素的随机访问。原创 2024-03-28 07:14:25 · 821 阅读 · 0 评论 -
C++(7): std::list的使用
std::list是 C++ 标准模板库(STL)中的一个顺序容器适配器,它提供了双向链表的数据结构。与 std::vector 不同,std::list 不存储连续的元素,因此它可以高效地在中间插入和删除元素,而不需要移动其他元素。原创 2024-03-26 11:01:55 · 1747 阅读 · 0 评论 -
C++(6): std::queue的使用
std::queue(队列)是C++标准容器之一,提供了的一种先进先出(FIFO)的线性存储结构。std::queue讲究先进先出,即从队列一端插入数据(入队),而从队列另一端提取数据(出队)。原创 2024-03-25 17:43:57 · 1120 阅读 · 0 评论 -
C++(5): std::ofstream的使用
之前讲到,ifstream具有将文件从硬盘中读进内存的功能。而ofstream则是执行反操作,它提供了将文件从内存写入磁盘的功能。std::ofstream 是 C++ 标准库中用于文件输出的类,它提供了向文件写入数据的能力。std::ofstream 属于 头文件中定义的一部分,是继承自 std::ostream 的派生类,专门用于文件操作。使用 std::ofstream 可以以文本或二进制形式写入文件,非常适用于数据持久化、日志记录等场景。原创 2024-03-25 16:01:23 · 2229 阅读 · 0 评论 -
C++(4): std::stringstream的使用
std::stringstream是C++标准库中提供的字符串流操作类,提供了istringstream、ostringstream两个子类,使用时需要包含头文件。原创 2024-03-22 14:36:29 · 1164 阅读 · 0 评论 -
C++(3): std::ifstream的使用
为了便于对文件的操作,C++标准库中提供了文件输入输出流fstream,并提供了头文件。fstream又细分了两个分支,分别是处理输入文件流的ifstream和处理输出文件流的ofstream。ifstream负责将文件从硬盘读取至内存中。ofstream负责将文件从内存写入硬盘中。这两者所处理的文件流均包含二进制文件(binary)和文本文件(text)。接下来我们将针对输入文件流ifstream用实际的例程介绍其使用方法。原创 2024-03-15 07:56:22 · 6359 阅读 · 0 评论 -
C++(2): std::thread的使用
线程是操作系统能够进行运算调度的最小单位。为了提高任务执行效率,在一些并发编程中,我们经常会使用多线程技术来同步执行一些任务。线程的主要优势在于它们允许程序进行并发处理。在多核或多处理器的系统中,多线程可以提升应用程序的性能,因为不同的线程可以并行执行。即便在单核处理器上,通过线程的时间分片(时间片轮转),操作系统也能提供多任务并发执行的感觉,这样可以使应用程序更加响应,提高资源的利用率。C++中为我们提供了语言级的线程库std::thread,实现了对线程的高级管理功能。原创 2024-03-14 16:56:07 · 719 阅读 · 0 评论 -
C++(1): std::vector的使用
vector是C++编程中使用频率较高的一种顺序容器。实际上是一个可以动态扩展内存的数组。原创 2024-03-14 09:29:56 · 737 阅读 · 0 评论 -
设计模式 - 享元模式
享元模式(FlyweightPattern)基本概念:享元模式通过重用现有的对象,从而减少创建对象的数量,达到减少内存占用和提高性能的目的。目的是什么:运用共享技术来有效地支持大量细粒度的对象。主要解决什么样的问题:有时需要使用大量的同类对象来进行一项工作。重点剖析:原件要有一个关键特征作为key;一个map,用于存放key-value;举例:不同的汽车原创 2017-10-11 09:53:39 · 252 阅读 · 0 评论 -
设计模式 - 外观模式
外观模式(Façade Pattern)基本概念:外观模式的主用工作室屏蔽实际的实例化操作,利用一个界面类(暂且称为界面类,是直接针对客户的类,不是真正的UI类)来生成一个个需要的对象。外观模式非常像工厂模式,不同点是外观模式的界面类中已经明确了要创建的实例对象。什么时候用到外观模式:对于用户来说,只需通过某个接口获得实例对象,而并不需要知道某个类的具体创建的过程。如一个系统(sy原创 2017-10-10 09:11:38 · 855 阅读 · 0 评论 -
设计模式(C++) - 首页
设计模式是代码设计经验的总结,具有极高的参考价值。通过对代码设计模式的学习和反复运用,能够写出更搞笑,组织性更强,更易于维护的代码。在此以C++语言为例,讲解一系列的设计模式。当然,在博客中的讲解大都比较宽泛,着重在于代码示例。有对代码不理解或有其他疑问的朋友可随时发邮件讨论,邮箱tecsai@163.com。相互学习,相互促进!原创 2017-10-09 10:01:23 · 193 阅读 · 0 评论 -
开发流媒体服务器 - 预告
预告最近闲来无事,花了些时间研究了一下国产精品开源流媒体服务器easyDarwin(不了解什么是流媒体服务器的同学可以现行百度)。一番研究下来,学到了不少知识。条件变量,队列,堆,锁,原子,多线程,select,epoll,TCPIP网络编程。文件及文件夹操作等。此外还有很多协议,rtsp, rtp/rtcp等。在此以easyDarwin为例,开个系列,与大原创 2017-10-05 14:26:35 · 251 阅读 · 0 评论 -
设计模式 - 装饰器模式
装饰器模式(DecoratorPattern)基本概念:装饰器模式属于结构型模式,用于向一个现有的类对象中添加新的功能。顾名思义,一个新的功能就像一个新的装饰一样,装饰了现有的对象,但又不能改变原有对象的结构。主要解决什么问题:面向对象编程中,为了对一类对象增加新的功能,我们通常的做法是派生一个新类,通过添加一些功能,从而得到一个具有更丰富功能的类对象。此时的问题在于,如果继承层次原创 2017-10-09 09:56:56 · 194 阅读 · 0 评论 -
设计模式-组合模式
组合模式(CompositePattern) 本来都是早上准备设计模式,之后开始一天的工作。然而今天上午有很重要的事情。最近在倒腾caffe,关于人脸识别的东西。caffe是基于C++开发的机器学习框架,亮点在于卷积神经网络(最近很火啊)。顺便为自己吆喝一声,有感兴趣的,可以交流。如果身在济南的,可以当面交流。我QQ544890059,邮件tecsai@163.com.回归原创 2017-10-08 16:07:14 · 234 阅读 · 0 评论 -
设计模式-过滤器模式
过滤器模式(Filter Pattern)基本概念:过滤器模式用于在一个列表(或其他容器)中,有条件的过滤一组对象。在容器中存放一组对象,按照事先约定好的规则,从这一组对象中返回一个个体或满足相应规则的子集合。具体应用举例:例如车库里停放着一定数量的汽车,有BENZ,BMW,AUDI,LEXUS等,车型有SUV,MPV, JEEP, VAN等,司机性别有男,有女。这个时候,我们想列原创 2017-10-07 10:02:58 · 500 阅读 · 0 评论 -
设计模式-适配器模式
适配器模式(Adapter Pattern)1. 目的是什么:将一个类的借口转换成客户希望的另一种类的借口。通过接口模式的使用,可以使得原来由于接口不兼容而不能正常工作的那些类可以一起工作。假设有一个接口类Target是客户期望的。有另一个接口Adaptee,是客户所不能直接对接工作的。此时客户想对接Adaptee进行工作。2. 实现思路:通过将原创 2017-10-05 07:26:27 · 253 阅读 · 0 评论 -
设计模式-单例模式
单例模式(Singleton)单例模式是软件开发比较简单的一种设计模式,也是日常用到的比较多的一种设计模式,这种模式属于创建模式。1. 单例模式具有以下特点:2. 只有一个实例;3. 有类自己唯一的创建这个实例;4. 该实例可以被全局的访问;???2. 具体什么时候会用到单例模式的类呢?通常情况下,我们想创建这样一个类,它具有较强的工具属性,甚至不需要原创 2017-09-27 11:20:01 · 179 阅读 · 0 评论 -
设计模式-原型模式
原型模式(Prototype Pattern)用原型来指定对象的类型,通过拷贝(clone)来创建一个新的对象。1. 什么时候会用到原型模式:当你想通过一个已经实例化以后的类拷贝而得到另一个相同类型的对象时,可使用此类,如java中的clone功能。进一步的说,当初始化一个类对象需要调动过多的资源,或者通过new操作来得到一个类对象时需要一些较为繁杂的数据处理时可使用原原创 2017-09-29 11:14:55 · 180 阅读 · 0 评论 -
设计模式-桥接模式
桥接模式(Bridge Pattern)目的:将抽象与实现分离,将两种不同变化属性分离。具体点就是说,有两个维度,分别是抽象维和实现维,通过桥接模式,可以实现两个维度的分别演变而互不影响。用途:用于对于一件事物具有两种不用的变化属性,每种变化属性都有几种不同的方案。两种属性可以自由组合。应用举例:逛商场买衣服时,主要有两种考虑情况,款式和颜色(当然价格也是因素之一,在此原创 2017-10-06 13:27:39 · 198 阅读 · 0 评论 -
设计模式-建造者模式
建造者模式一个个build类和多个简单的类,build一步步的通过简单类来构建一个复杂的类。1. 简淡的描述:建造者模式通常解决创建复杂类这样一个问题。这样一个复杂的类通常由一些小的简单的类,通过一定的方法组合而成。这些简单类相对稳定,组合方法也相对稳定,唯一不稳定的是这个复杂类。2. 引用一句话:将变与不变分离开。3. 与工厂模式的区别:建造者原创 2017-09-28 13:24:58 · 182 阅读 · 0 评论