自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 包装器和适配器应用场景-如何取代虚函数

虚函数在执行过程中会跳转两次(先查找对象的函数表,再次通过该函数表中的地址找到真正的执行地址),这样的话,CPU会跳转两次,而普通函数只跳转一次。为了管理的方便(基类指针可指向派生类对象和自动析构派生类),保留类之间的继承关系。每跳转一次,预取指令要作废很多,所以效率会很低。

2025-08-18 19:34:14 225

原创 包装器和绑定器应用场景-回调函数的实现

在消息队列和网络库的框架中,当接收到消息(报文)时,回调用户自定义的函数对象,把消息(报文)参数传给它,由它决定如何处理。

2025-08-18 17:29:35 147

原创 包装器和绑定器应用场景-可变函数和参数

写一个函数,函数的参数是函数对象及参数,功能和。

2025-08-18 16:18:33 215

原创 C++适配器bind

意思是如果现有的函数类型与要求的函数类型不同,那么,可以用bind对现有的函数对象进行转换,生成新的函数对象,与要求的函数类型匹配。模板函数是一个通用的函数适配器(绑定器),它用一个可调用对象及其参数,生成一个新的可调用对象,以适应模板。:需要绑定的可调用对象(可以是前两节课介绍的那六种,也可以是。:绑定参数列表,可以是左值、右值和参数占位符。,如果参数不是占位符,缺省为值传递,

2025-08-18 15:29:57 372

原创 C++包装器function

把不同形式的可调用对象(函数、成员函数、lambda、仿函数等)统一成一个接口,方便存储、传递和调用。是一个通用的可调用对象的包装器,用简单的、统一的方式处理可调用对象。运算符,用于判断是否包装了可调用对象。对象未包装可调用对象,使用。返回类型(参数列表)

2025-08-18 14:31:32 320

原创 可调用对象

在C++中,可以像函数一样调用的有:普通函数、类的静态成员函数、仿函数、lambda函数、类的非静态成员函数、可被转换为函数的类的对象,统称可调用对象或函数对象。可调用对象有类型,可以用指针存储它们的地址,可以被引用(类的成员函数除外)

2025-08-18 11:44:39 234

原创 C++原子类型atomic

比较原子变量的值和预期值expect,如果当两个值相等,把val存储到原子变量中,函数返回true;如果当两个值不相等,用原子变量的值更新预期值,函数返回false。原子操作由CPU指令提供支持,它的性能比锁和消息传递更高,并且,不需要程序员处理加锁和释放锁的问题,支持修改、读取、交换、比较并交换等操作。查询某原子类型的操作是直接用CPU指令(返回true),还是编译器内部的锁(返回false)。模板类的模板参数支持指针,但不表示它所指向的对象是原子类型。把val的值存入原子变量,返回原值。

2025-08-16 18:55:01 292

原创 C++ 条件变量-生产消费者模型

条件变量是一种线程同步机制。当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。风格(在构造时获得锁,在析构时释放锁)。它们的区别在于:为了配合。循环的阻塞当前线程,直到通知到达且谓词满足。:是一种通用的条件变量,可以与任意。搭配(包括用户自定义的锁类型)。是模板类,模板参数为互斥锁类型。时间长度,Pred pred)阻塞当前线程,直到通知到达。时间点,Pred pred)都是管理锁的辅助类,都是。消费者进程会一直等待。通知一个等待的线程。通知全部等待的线程。

2025-08-16 18:42:34 272

原创 C++互斥锁

C++11提供了四种互斥锁:mutex:互斥锁。:带超时机制的互斥锁。:递归互斥锁。:带超时机制的递归互斥锁。包含头文件:一、mutex类1)加锁lock()互斥锁有锁定和未锁定两种状态。如果互斥锁是未锁定状态,调用lock()成员函数的线程会得到互斥锁的所有权,并将其上锁。如果互斥锁是锁定状态,调用lock()成员函数的线程就会阻塞等待,直到互斥锁变成未锁定状态。2)解锁unlock()只有持有锁的线程才能解锁。3)尝试加锁try_lock()

2025-08-16 17:49:35 547

原创 C++11线程

在C++11之前,C++没有对线程提供语言级别的支持,各种操作系统和编译器实现线程的方法不一样。C++11增加了线程以及线程相关的类,统一编程风格、简单易用、跨平台。

2025-08-16 17:16:18 1389

原创 可变参数模板

可变参数模版是C++11新增的最强大的特性之一,它对参数进行了泛化,能支持任意个数、任意数据类型的参数。

2025-08-16 11:05:46 186

原创 完美转发

在函数模板中,可以将参数“完美”的转发给其它函数。所谓完美,即不仅能准确的转发参数的值,还能保证被转发参数的左、右值属性不变。标准引入了右值引用和移动语义,所以,能否实现完美转发,决定了该参数在传递过程使用的是拷贝语义还是移动语义。)如果模板中(包括类模板和函数模板)函数的参数书写成为。,那么,函数既可以接受左值引用,又可以接受右值引用。是一个右值,转发之后仍是右值引用;是一个左值,转发之后仍是左值引用。

2025-08-16 11:01:46 151

原创 移动语义

左值对象被转移资源后,不会立刻析构,只有在离开自己的作用域的时候才会析构,如果继续使用左值中的资源,可能会发生意想不到的错误。深拷贝把对象中的堆区资源复制了一份,如果源对象(被拷贝的对象)是临时对象,拷贝完就没什么用了,这样会造成没有意义的资源申请和释放操作。C++11中,将拷贝数据的操作叫拷贝语义,而移动语义的意思是:不要拷贝,直接把资源转移过来,资源都是用指针指向的,把指针处理一下就可以转移资源,不用拷贝数据,所以转移资源的操作叫移动语义。实现移动语义要增加两个函数:移动构造函数和移动赋值函数。

2025-08-15 17:34:01 252

原创 右值引用

但是,常量左值引用却是个奇葩,它可以算是一个万能的引用类型,它可以绑定非常量左值、常量左值、右值,而且在绑定右值的时候,常量左值引用还可以像右值引用一样将右值的生命期延长,缺点是,只能读不能改。中的引用很常见,就是给变量取个别名,在C++11中,因为增加了右值引用(rvalue reference)的概念,所以C++98中的引用都称为了左值引用(lvalue reference)。的返回值本来在表达式语句结束后其生命也就该终结了(因为是临时变量),而通过右值引用重获了新生,其生命周期将与右值引用类型变量。

2025-08-15 16:43:15 327

原创 lambda函数

6、在lambda函数中,如果希望修改值捕获变量的值,可以加mutable选项,但是,在lambda函数的外部,变量的值不会被修改。2、用后置的方法书写返回类型,类似于普通函数的返回类型,如果不写返回类型,编译器会根据函数体中的代码推断出来。1、参数列表是可选的,类似普通函数的参数列表,如果没有参数列表,()可以省略不写。5、捕获列表书写在[ ]中,与函数参数的传递类似,捕获方式可以是值和引用。亲爱的" << no << "号:我是月月鸟\n";函数是C++11标准新增的语法糖,也称为。

2025-08-15 16:26:52 304

原创 委托构造和继承构造

在实际的开发中,为了满足不同的需求,一个类可能会重载多个构造函数。例如变量初始化,如果在每个构造函数中都写一遍,这样代码会显得臃肿。推出了继承构造(Inheriting Constructor),在派生类中使用using来声明继承基类的构造函数。在C++11之前,派生类如果要使用基类的构造函数,可以在派生类构造函数的初始化列表中指定。委托构造就是在一个构造函数的初始化列表中调用另一个构造函数。一旦使用委托构造,就不能在初始化列表中初始化其它的成员变量。标准新增了委托构造和继承构造两种方法,用于简化代码。

2025-08-15 15:31:05 191

原创 C++11新标准

三、原始字面量一、long long 类型新增了类型long long和unsigned long long,以支持64位(或更宽)的整型。在VS中,int和long都是4字节,long long是8字节。在Linux中,int是4字节,long和long long是8字节。二、新增了类型char16_t和char32_t,以支持16位和32位的字符。三、原始字面量原始字面量(值)可以直接表示字符串的实际含义,不需要转义和连接。语法:R"(字符串的内容)"

2025-08-15 15:07:23 1537

原创 C++断言

包含头文件#include <cassert> 语法:assert(表达式);断言就是判断(表达式)的值,如果为0(false),程序将调用abort()函数中止,如果为非0(true),程序继续执行。C++11新增了静态断言static_assert,用于在编译时检查源代码一、断言断言(assertion)是一种常用的编程手段,用于排除程序中不应该出现的逻辑错误。使用断言需要包含头文件<cassert>或<assert.h>,头文件中提供了带参数的宏assert。

2025-08-15 11:51:41 457

原创 C++异常

如果程序中抛出的异常没有被捕获,程序将异常中止1)捕获全部的异常try//可能抛出异常的代码。// throw异常对象;//不管什么异常,都在这里统一处理。2)捕获指定的异常try//可能抛出异常的代码。// throw异常对象;//发生exception1异常时的处理代码。//发生exception2异常时的处理代码。在try语句块中,如果没有发生异常,执行完try语句块中的代码后,将继续执行try语句块之后的代码;如果发生了异常,用throw。

2025-08-15 11:37:25 1216

原创 随机存取

直接移动文件的位置指针,在指定位置读/写数据。注意Windows系统中文本文件的换行,写入数据的时候,系统会将"\n"转换成"\r\n"。文件的位置指针:对文件进行读/写操作时,文件的位置指针指向当前文件读/写的位置。end-文件的结尾位置。随机存取是指直接移动文件的位置指针,在指定位置读取/写入数据。(覆盖写,而不是插入),文件内容会在指针位置直接被修改。从文件开始的位置往后移30字节。从文件结尾的位置往前移10字节。把文件指针移到第128字节。把文件指针移动文件的开始。把文件指针移动文件的结尾。

2025-08-15 10:32:14 278

原创 文件操作-读取二进制文件

如果文件不存在,则打开文件失败。读取数据用read()函数。以二进制方式打开文件。

2025-08-15 10:06:40 250

原创 文件操作-写入二进制文件

d)不要以文本模式打开二进制文件,也不要用行的方法操作二进制文件,可能会破坏二进制数据文件的格式,也没有必要。(因为二进制文件中的某字节的取值可能是换行符,但它的意义并不是换行,可能是整数n个字节中的某个字节))在Windows平台下,如果以文本方式打开文件,写入数据的时候,系统会将"\n"转换成"\r\n";)以文本方式读取文件的时候,遇到换行符停止,读入的内容中没有换行符;以二制方式读取文件的时候,遇到换行符不会停止,读入的内容中会包含换行符(换行符被视为数据)。不截断文件内容,只在文件未尾追加文件。

2025-08-15 10:02:40 440

原创 文件操作-读取文本文件

如果文件不存在,则打开文件失败。

2025-08-15 09:56:13 212

原创 文件操作-写入文本文件

不管用哪种模式打开文件,如果文件不存在,都会创建文件。不截断文件内容,只在文件未尾追加文件。(truncate)文本文件一般以行的形式组织数据。缺省值:会截断文件内容。

2025-08-15 09:52:08 150

原创 智能指针weak_ptr

是为了配合shared_ptr而引入的,它指向一个由shared_ptr管理的资源但不影响资源的生命周期。也就是说,将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。不论是否有weak_ptr指向,如果最后一个指向资源的shared_ptr被销毁,资源就会被释放。更像是shared_ptr的助手而不是智能指针。

2025-08-15 09:47:06 155

原创 智能指针shared_ptr

unique_ptr的效率更高,占用的资源更少。也可象普通指针那样,当指向一个类继承体系的基类对象时,也具有多态性质,如同使用裸指针管理基类对象和派生类对象那样。,重载了操作符[],操作符[]返回的是引用,可以作为左值使用。可以指向(关联)相同的对象,在内部采用计数机制来实现。解除与资源的关系,资源的引用计数减1。赋值将把计数减1,如果计数为0,将释放对象,空的。的计算器将加1,引用计数归0就释放资源。解除与资源的关系,资源的引用计数减1。所指向的同一个对象,不管是相同的。与对象关联时,引用计数增加1。

2025-08-14 20:39:40 337

原创 智能指针unique_ptr

unique_ptr不是绝对安全,如果程序中调用exit()退出,全局的unique_ptr可以自动释放,但局部的unique_ptr无法释放。)unique_ptr也可象普通指针那样,当指向一个类继承体系的基类对象时,也具有多态性质,如同使用裸指针管理基类对象和派生类对象那样。)用nullptr给unique_ptr赋值将释放对象,空的unique_ptr==nullptr。数组版本的unique_ptr,重载了操作符[],操作符[]返回的是引用,可以作为左值使用。释放pp对象指向的资源对象。

2025-08-14 20:08:23 583

原创 写一个findif函数

【代码】写一个findif函数。

2025-08-14 17:53:06 138

原创 写一个foreach函数

C++中函数想作为参数传递到另一个函数需要用到函数指针。重点在于模板的思想以及回调的思想。模板的思想:传迭代器。

2025-08-14 17:13:50 156

原创 queue容器

容器的逻辑结构是队列,物理结构可以是数组或链表,主要用于多线程之间的数据共享。第一个参数是元素类型,第二个参数是底层容器类型。包含头文件: #include<queue>,还可以用自定义的类模板。:底层容器的类型,缺省是。

2025-08-12 20:10:22 156

原创 undered_map容器

/ 创建一个空的umap容器,指定了桶的个数。封装了哈希表,查找,插入和删除元素时,只需要比较几次key的值。桶是数组,桶中的元素是链表。哈希表自动扩展的代价很高,所以创建容器的时候就指定桶的数量,尽量不要在程序运行时改变表长。

2025-08-12 19:58:01 120

原创 map容器

查找成员函数(find(),lower_bound(),upper_bound(),count()) 插入和删除(insert(),emplace(),二者返回键值对,emplace_hint())emplace()函数中,pair有两种数据类型,都需要构造,为解决这个问题c++提供了分段构造技术,就不需要进行拷贝构造操作了。封装了红黑树,用于查找。容器中的元素是pair键值对。map容器会根据键值自动排序放置结点的位置。

2025-08-12 19:23:22 122

原创 pair键值对

是类模板,一般用于表示key/value数据,其实现是结构体。make_pair是函数模板,返回pair结构体对象。第二个成员,一般表示value。第一个成员,一般表示key。有两个参数的构造函数。

2025-08-11 20:15:46 314

原创 list容器的操作

各种成员函数以及注意(reverse(),srot(),merge(),splice(),remove(),unique())

2025-08-11 19:50:43 225

原创 list容器

在指定位置插入一个元素,…用于构造元素,返回指向插入元素的迭代器。在链表的尾部追加一个元素,…在链表的头部插入一个元素,…包含头文件: #include<list>移动构造函数(C++11标准)

2025-08-11 19:41:26 157

原创 基于范围的for循环

迭代器变量,如果容器中的元素是结构体和类,迭代器变量应该申明为引用,加const约束表示只读。同时注意迭代器失效的问题

2025-08-11 19:24:18 270

原创 迭代器-访问容器中元素的通用方法

2)双向迭代器:具备正向迭代器的功能,还可以反向(从右到左)遍历容器(也是用++),不管是正向还是反向遍历,都可以用--让迭代器后退一个元素。4)输入和输出迭代器:这两种迭代器比较特殊,它们不是把容器当做操作对象,而是把输入/输出流作为操作对象。迭代器支持的基本操作:赋值(=)、解引用(*)、比较(==和!用于比较两个迭代器相对位置的关系运算(<、<=、>、>=)。迭代器和一个整数值的加减法运算(+、+=、-、-=)。如果使用迭代器,不同的容器,访问元素的方法是相同的。迭代器是访问容器中元素的通用方法,

2025-08-11 19:13:21 228

原创 vector容器

reserve()、assign()、push_back()、pop_back()、insert()、erase()等函数会引起vector容器的动态数组发生变化,可能导致vector迭代器失效。如果省略该模板参数的值,将默认使用allocator<T>,用new和delete分配和释放内存。各种STL容器模板都接受一个可选的模板参数,该参数指定使用哪个分配器对象来管理内存。在指定位置插入一个元素,…用于构造元素,返回指向插入元素的迭代器。在容器的尾部追加一个元素,…移动构造函数(C++11标准)

2025-08-11 18:56:17 131

原创 string容器的设计目标

不应该使用memset函数来清空含有string类成员的类,会清空string类中动态数组的地址,造成内存泄漏。2是用于存放数据的内存空间(缓冲区。string 容器用途:1是用于存放字符串。string容器的设计目标。

2025-08-09 18:55:11 176

原创 string容器基础

与普通的字符数组相比,string容器有三个优点:1)使用的时候,不必考虑内存分配和释放的问题;2)动态管理内存(可扩展);3)提供了大量操作容器的API。缺点是效率略有降低,占用的资源也更多。是字符容器,内部维护了一个动态的字符数组。类模板的一个具体化版本的别名。

2025-08-09 18:47:16 212

空空如也

空空如也

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

TA关注的人

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