
c++
文章平均质量分 80
Fre丸子_
在这里会给大家总结一些小常识
展开
-
不继承thread写线程
【代码】不继承thread写线程。原创 2024-08-09 20:47:07 · 160 阅读 · 0 评论 -
【C++】设计模式之——建造者
建造者模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。首先先大体了解一下,建造者模式是什么意思,它是怎么实现的?建造者模式主要用于构建复杂问题。原创 2023-10-03 21:54:30 · 1188 阅读 · 10 评论 -
C++多态
如果析构函数前面不加virtual,那么就会发生内存泄漏原创 2023-07-24 19:36:35 · 96 阅读 · 0 评论 -
认识C++继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。继承类是不可访问父类的私有成员的,即使继承方式为共有的也不可以。如果将类改为struct声明的则就会变为共有的public。不写继承方式默认为私有private类型的。原创 2023-07-21 22:18:06 · 94 阅读 · 0 评论 -
【C++】类型转换
而使用dynamic_cast进行向下转型则是安全的,如果父类的指针(或引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针。上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针。dynamic_cast用于将父类的指针(或引用)转换成子类的指针(或引用)。原创 2023-10-02 15:09:12 · 179 阅读 · 0 评论 -
【C++】单例
new和delete默认调用的是全局的operator new函数和operator delete函数,但如果一个类重载了专属的operator new函数和operator delete函数,那么new和delete就会调用这个专属的函数。将该类的构造函数设置为私有即可,因为子类的构造函数被调用时,必须调用父类的构造函数初始化父类的那一部分成员,但父类的私有成员在子类当中是不可见的,所以在创建子类对象时子类无法调用父类的构造函数对父类的成员进行初始化,因此该类被继承后子类无法创建出对象。原创 2023-10-02 09:43:13 · 199 阅读 · 0 评论 -
【C++】智能指针
上述程序是没有问题的,两个结点都能够正确释放。当智能指针对象的生命周期结束时,所有的智能指针默认都是以delete的方式将资源释放,这是不太合适的,因为智能指针并不是只管理以new方式申请到的内存空间,智能指针管理的也可能是以new[]的方式申请到的空间,或管理的是一个文件指针。需要注意的是,智能指针就是要模拟原生指针的行为,当我们将一个指针赋值给另一个指针时,目的就是让这两个指针指向同一块内存空间,所以这里本就应该进行浅拷贝,但单纯的浅拷贝又会导致空间被多次释放,因此根据解决智能指针拷贝问题方式的不同,原创 2023-10-01 18:34:49 · 228 阅读 · 0 评论 -
【C++】异常
实际中很多公司都会自定义自己的异常体系进行规范的异常管理。公司中的项目一般会进行模块划分,让不同的程序员或小组完成不同的模块,如果不对抛异常这件事进行规范,那么负责最外层捕获异常的程序员就非常难受了,因为他需要捕获大家抛出的各种类型的异常对象。因此实际中都会定义一套继承的规范体系,先定义一个最基础的异常类,所有人抛出的异常对象都必须是继承于该异常类的派生类对象,因为异常语法规定可以用基类捕获抛出的派生类对象,因此最外层就只需捕获基类就行了。原创 2023-10-01 14:09:44 · 186 阅读 · 0 评论 -
【C++】function包装器和bind包装器
function是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,C++中的function本质就是一个类模板。Ret:被包装的可调用对象的返回值Args:被包装可调用对象的形参类型包装示例function包装器可以对可调用对象进行包装,包括函数指针(函数名)、仿函数(函数对象)、lambda表达式、类的成员函数。//仿函数public:class Pluspublic:int main()//1.包装函数指针(函数名)//2.包装仿函数(函数对象)原创 2023-09-30 11:07:21 · 225 阅读 · 1 评论 -
【C++11】多线程
主线程创建新线程后,也可以调用detach进行将线程和主线程分离,分离后,新线程会到后台运行,其所有权和控制权将会交给C++运行库,此时,c++运行库会保证当线程退出时,其相关资源能够被正确回收。线程函数的参数是以值拷贝的方式拷贝到线程栈空间中的,就算线程函数的参数为引用类型,在线程函数中修改后也不会影响到外部实参,因为其实际引用的是线程栈中的拷贝,而不是外部实参。在没有对临界资源加锁的时候,由于是多个进程同时进行,这时,不能同步的,正确的完成我们的任务,此时我们就需要给临界资源进行加锁。原创 2023-09-29 22:12:08 · 1335 阅读 · 0 评论 -
【C++】C++11——lambda表达式
说明一下: 实际当我们以[&]或[=]的方式捕获变量时,编译器也不一定会把父作用域中所有的变量捕获进来,编译器可能只会对lambda表达式中用到的变量进行捕获,没有必要把用不到的变量也捕获进来,这个主要看编译器的具体实现。这样一来,调用lambda表达式时就不用传入参数了,但实际我们只需要用到变量a和变量b,没有必要把父作用域中的所有变量都进行捕捉,因此也可以只对父作用域中的a、b变量进行捕捉。使用该修饰符时,参数列表不可以省略。:在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。原创 2023-09-23 09:51:52 · 150 阅读 · 3 评论 -
【C++】C++11——可变参数模板和emplace
可变参数包的个数可以为0,也可以为N返回类型 函数名(Args ...args)//函数体{}模板参数包Args和函数形参参数包args名字可以任意指定,并不是强制的。原创 2023-09-23 08:48:32 · 642 阅读 · 0 评论 -
【C++】C++11——构造、赋值使用条件和生成条件
我们可以看出,此时输出的为移动构造,当我们将person类中的析构拷贝构造等复原的时候,这时就不满足条件了,也就调用的为深度拷贝了。在有一些条件下,我们的默认构造总是默认生成失败,为了解决这个问题,C++11推出了关键字default来强制将其生成。从以上代码我们可以看出,我们person类中只有一个构造函数,这时是满足我们默认生成的条件的。在这里,移动构造和移动赋值并不是说没有写就会自动生成,而是需要一定的条件支持下才会生成。默认生成的移动构造和移动赋值做的什么赋值。原创 2023-09-23 08:48:15 · 306 阅读 · 0 评论 -
【C++】左值和右值
这里需要说明的是,对于返回局部对象的函数,就算只是调用函数而不接收该函数的返回值,也会存在一次拷贝构造或移动构造,因为函数的返回值不管你接不接收都必须要有,而当函数结束后该函数内的局部对象都会被销毁,所以就算不接收函数的返回值也会调用一次拷贝构造或移动构造生成临时对象。右值引用需要是确定的类型,而万能引用是根据传入实参的类型进行推导,如果传入的实参是一个左值,那么这里的形参t就是左值引用,如果传入的实参是一个右值,那么这里的形参t就是右值引用。通常,左值对应于具名的变量、被引用的对象以及某些表达式的结果。原创 2023-09-22 08:32:00 · 471 阅读 · 0 评论 -
【C++】C++11——列表初始化及decltype
内置类型注意: 用大括号对new表达式初始化时不能加等号。自定义类型创建对象时也可以使用列表初始化方式调用构造函数初始化。比如:C++11中新添加了容器,该容器没有提供过多的成员函数当我们使用auto进行定义一个变量,来进行接收列表初始化过的变量时,我们发现它的类型为类型,使用的方式查看该变量的类型。initializer_list容器没有提供对应的增删查改等接口,因为initializer_list并不是专门用于存储数据的,而是为了让其他容器支持列表初始化的。比如:C++98并不支持直接用列表原创 2023-09-21 10:03:27 · 515 阅读 · 1 评论 -
【C++】哈希位图和布隆过滤器
假设布隆过滤器使用三个哈希函数进行映射,那么“张三”这个昵称被使用后位图中会有三个比特位会被置1,当有人要使用“李四”这个昵称时,就算前两个哈希函数计算出来的位置都产生了冲突,但由于第三个哈希函数计算出的比特位的值为0,此时系统就会判定“李四”这个昵称没有被使用过。当元素不存在时,对应位置的位值为0。我们这里可以大概估算一下,如果使用3个哈希函数,即k的值为3,l n 2 的值我们取0.7,那么 m 和 n的关系大概是m = 4 × n ,也就是布隆过滤器的长度应该是插入元素个数的4倍。原创 2023-09-17 21:20:56 · 1314 阅读 · 56 评论 -
【C++】哈希表的实现
与闭散列的哈希表不同的是,在实现开散列的哈希表时,我们不用为哈希表中的每个位置设置一个状态字段,因为在开散列的哈希表中,我们将哈希地址相同的元素都放到了同一个哈希桶中,并不需要经过探测寻找所谓的“下一个位置”。与闭散列不同的是,这种将相同哈希地址的元素通过单链表链接起来,然后将链表的头结点存储在哈希表中的方式,不会影响与自己哈希地址不同的元素的增删查改的效率,因此开散列的负载因子相比闭散列而言,可以稍微大一点。的时候,这时发现,如果我们已同样的方法进行插入的时候,就会与 1 下标位置的元素起到冲突。原创 2023-09-15 15:05:47 · 891 阅读 · 13 评论 -
【C++】红黑树
红黑树结点插入情况二:uncle不存在uncle存在且为黑色原创 2023-08-30 16:02:35 · 1273 阅读 · 33 评论 -
【C++】AVL树(高度平衡二叉树)
/ 该节点的左孩子// 该节点的右孩子// 该节点的父节点// 该节点的平衡因子int _bf;,_kv(kv),_bf(0){}//判断是否平衡cout << root->_kv.first << "节点平衡因子异常" << endl;//计算它的最大高度return 0;原创 2023-08-26 22:52:46 · 1038 阅读 · 43 评论 -
排序总结及详讲
然后,取,重复上述分组和排序的工作。直接插入排序的基本思想就是把待排序的数值,插入到已经排序好的有序序列中,直到所有的数值都插入完为止,得到一个新的有序序列;基本思想:所谓交换,就是根据序列中两个记录数组下标的元素大小,来对换这两个元素在数组中的位置,交换排序的特点是:将数据元素较大的记录向数组尾部移动,较小的往数组前部移动。从上面的简介图的过程来看,向下取整是从最后一个孩子结点的父亲结点开始向下取整,直到所有的父亲结点都过完一次才结束,大的数字往上浮,小的数字往下面沉,这种操作也叫建大堆。原创 2023-04-11 17:33:13 · 136 阅读 · 0 评论 -
【C++】异常
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛。出异常的代码,try 块中的代码被称为保护代码。原创 2023-08-07 16:38:23 · 149 阅读 · 0 评论 -
【C++】树形结构的关联式容器(map、set)
根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。如果要查找的元素在本set中没有,则会返回跟他最接近且大的值,如果要查找的元素只有一个,则会返回元素本身到最后一个元素区间。在查找目标值的时候,只针对搜索大于等于该值的目标,并且找到后返回其。map的【】和我们平时使用的【】是完全不一样的。insert插入用的pair来插入的。位置,如果没有找到,则返回。返回目标值后一个位置的。原创 2023-08-06 11:39:01 · 357 阅读 · 0 评论 -
【C++】自定义实现vector逻辑纯代码
【代码】自定义实现vector逻辑纯代码。原创 2023-07-15 19:41:45 · 311 阅读 · 0 评论 -
【C++】二叉搜索树(二叉排序树)
如果删除的为根结点,则我们就需要改进。查找时间为O(N),高度次。如果要删除的节点左右不为空。如果删除的数字时3和10。原创 2023-07-28 13:27:35 · 157 阅读 · 0 评论 -
简单明了证明多态虚表是位于常量区
【代码】简单明了证明多态虚表是位于常量区。原创 2023-07-25 18:15:31 · 240 阅读 · 0 评论 -
模板的深入认识
解决办法。原创 2023-07-21 19:43:32 · 66 阅读 · 0 评论 -
C++ stack和queue 模拟实现
2 栈是作为容器适配器实现的,这些适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。2 队列是作为容器适配器实现的,容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。3 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类模板容器类。1 栈是一种容器适配器,专门设计用于后进先出的后进先出环境,在这种环境中,元素只从容器的一端插入和提取。3 底层容器可以是任何标准容器类模板或其他特定设计的容器类。原创 2023-07-19 18:16:11 · 1042 阅读 · 0 评论 -
栈的压入、弹出序列
【代码】栈的压入、弹出序列。原创 2023-07-18 12:19:21 · 180 阅读 · 0 评论 -
用异或计算只出现一次的数字
因为与0异或的都是数字本身,数字本身和数字本身异或是等于0,应用这个定理,我们来做这个题。原创 2023-06-28 18:46:35 · 96 阅读 · 0 评论 -
string模拟实现常用类
【代码】string模拟实现常用类。原创 2023-06-27 20:22:03 · 75 阅读 · 0 评论 -
C++string类
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问,所以C++中提出了。当在string的成员函数中作为len(或sublen)参数的值时,该值表示“直到字符串结束”。该常量定义为值为1,由于size_t是无符号整型,因此它是该类型可能表示的最大值。Npos是一个静态成员常量值,它包含一个元素或类型size-t的最大可能值。原创 2023-05-23 18:35:10 · 1003 阅读 · 0 评论 -
template模板初步认识
这时的交换程序为分批交换的,当交换的变量都为整型时,调用整型函数,为双精度浮点时调用浮点函数,但是如果实参需要混合交换,比如又有整型又有浮点型,这时就需要我们重新规划写一个函数。类模板实例化和函数模板实例化是不同的,类模板实例化需要在类模板后面跟,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。函数模板的作用域只在它归属下的这个函数里,如果除了函数在使用就失效了,而类模板的作用域只在它归属下的这个类里,出了类也就失效了。:让编译器根据实参推演模板参数的实际类型。原创 2023-05-18 11:00:58 · 556 阅读 · 0 评论 -
C/C++内存管理
new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数//自定义类型申请动态空间 class A {public :} ~ A() {int _a;free(ptr1);cout原创 2023-05-16 17:22:06 · 99 阅读 · 0 评论 -
类与对象(下)
构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换作用。初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。在调用对象时,编译器通过调用构造函数来进行赋初值,如果没有构造函数编译器会调用默认构造函数(自动生成)的时候进行了优化,直接构造函数,所以输出结果为二。当我们使用类进行调用非静态成员函数时,就会报错。可以用类对象调用,也可以直接用类名来调用。在开始之前,我们先认识到,原创 2023-05-09 18:13:12 · 101 阅读 · 1 评论 -
类与对象(中)
在我们日常写程序中,有些时候总会忘记初始化,或者程序结束后忘记释放空间,销毁变量等,因此,c++引入了构造函数。原创 2023-05-02 15:14:27 · 117 阅读 · 4 评论 -
类与对象(上)
/ 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或类的成员变量;类中的函数称为类的方法或者成员函数。声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。//struct的类默认为公开的 //class的类默认为私有的 struct stack //class stack {原创 2023-04-25 15:05:43 · 86 阅读 · 0 评论 -
创建一个二叉树堆(向上调堆和向上调堆详讲)
向上调堆和向上调堆详讲原创 2023-03-25 22:58:32 · 99 阅读 · 0 评论 -
栈和队列介绍及全部源码
栈是一种限定性线性表,是将线性表的插入和删除限制在只能在一端操作,我们通俗的叫为栈顶(Top),通常只允许在栈顶进行插入、删除。表的另一端我们通俗的较为栈底(Bottom),一般栈底不做任何操作。栈的插入操作我们一般形象的称为入栈和进栈,删除操作形象的叫为出栈和退栈。栈的操作顺序为先进后出,后进先出,一般采用数组来存储栈是较为方便的。1 所在的位置为栈底,5 所在的位置为栈顶,入栈顺序为 1、2、3、4、5;由于栈顶只允许插入和删除,所以出栈顺序为 5、4、3、2、1。原创 2023-03-24 11:28:41 · 371 阅读 · 0 评论 -
单链表增删查改查
单链表原创 2023-03-12 16:11:23 · 264 阅读 · 0 评论 -
顺序表及malloc、calloc、realloc简介介绍
顺序表及malloc、calloc、realloc简介介绍原创 2023-03-11 17:11:00 · 535 阅读 · 0 评论