
C++
文章平均质量分 95
持之以恒的天秤
这个作者很懒,什么都没留下…
展开
-
static详解
时,它的核心作用是。原创 2025-05-25 22:05:47 · 1257 阅读 · 0 评论 -
单例模式概念
单例模式,英文叫做。是一种创建型设计模式,它保证一个类在程序中仅有一个实例,并对外提供一个访问的该类实例的全局接口。单例模式通常用于需要控制对象资源的开发场景,一个类只创建一个对象的设计,既可以避免创建过多副本所造成的资源浪费现象,又可以避免引发数据一致性等问题。单例模式将所有构造函数设计成私有的,防止外部创建对象;给出公有静态成员函数为获取对象实例的唯一渠道。单例模式经常被用在数据缓存、日志log调用、参数配置、线程池等开发场景。经常使用单例模式来创建对象,可以有效地降低内存对资源的占用。原创 2025-05-19 21:03:37 · 705 阅读 · 0 评论 -
哈希表和哈希函数
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log2Nlog_2 Nlog2N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中:该方式即为哈希(散列原创 2025-05-19 21:01:24 · 768 阅读 · 0 评论 -
lambda表达式和function包装器
函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。原创 2025-05-18 21:29:45 · 948 阅读 · 0 评论 -
C++中的异常机制
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。public:, _id(id){}protected:// 错误描述int _id;// 错误编号我们先定义一个基类,其中有2个成员变量,_errmsg用于描述错误信息,_id表示的是异常编号。成员函数是what(),表示的是返回错误信息。原创 2025-05-17 22:08:36 · 898 阅读 · 0 评论 -
右值引用的学习
传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。原创 2025-05-14 21:27:30 · 1052 阅读 · 0 评论 -
红黑树的学习及情况处理
既然名称叫红黑树,那么就可以通过枚举来区分一个节点的颜色。红黑树节点的定义, _kv(kv){}和AVL树的定义一样,只是多了一个颜色,但是颜色为什么要初始化成红色的呢?我们先来思考一下,插入红色节点或者黑色节点,谁对红黑树的影响最大。来看这张图片,当插入的是黑色节点的时候,每条路径上的黑色节点数量不相同了,那么就需要在其它路径添加一定数量的黑色节点保持性质4;而插入红色节点只会影响当前路径,所以新节点应该是红色。原创 2025-05-11 21:56:45 · 792 阅读 · 0 评论 -
AVL树的学习
假如以parent为根的子树不平衡,即parent的平衡因子为2或者-2,分以下情况考虑。原创 2025-05-11 21:48:06 · 866 阅读 · 0 评论 -
信号的概念及产生
signal函数,头文件是<signal.h>,它的作用是可以自己定义信号的处理方式。其中,本质是一个类型的函数指针。也就是说自定义的信号处理函数必须是void (int)的格式。其中这个处理函数的第一个参数int,就是用来接收信号的编号的。返回值返回的是该信号处理的函数的函数指针。return 0;这个程序中,我们通过把2号信号的处理动作变成了自定义动作,即handler,原本2号信号是退出进程。运行这段代码,进程收到2号信号时,就会发送这句话。原创 2025-05-08 21:53:29 · 828 阅读 · 0 评论 -
map和set
用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器,如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器operator[]函数最后将insert返回值键值对中的value返回。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。原创 2025-05-07 21:04:43 · 792 阅读 · 0 评论 -
多态的学习
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:cout << "动物在说话" << endl;public:cout << "小狗在汪汪" << endl;//动物在说话return 0;原创 2025-05-06 21:37:56 · 1018 阅读 · 0 评论 -
二叉搜索树
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:这个图片不符合二叉搜索树的性质,因为5和7都比10小。而这副图片完全符合二叉搜索树的性质,左子树的值都比根节点小,右子树的值都比根节点大。另外二叉搜索树走中序的话就会排列成升序,所以又叫“二叉排序树”。因此我们判断一棵树是否是二叉搜索树,就可以利用中序的方法。默认情况下二叉搜索树不允许出现重复的值。二叉搜索树的每个节点都要存储它们的左子树节点、右子树节点和节点存储的值。所以它的结构如下,包括构造函数:对于二叉搜索树的类,我们只需要原创 2025-04-29 21:56:20 · 878 阅读 · 0 评论 -
C++中的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用定义格式下面我们看到Person是父类,也称作基类。public:protected:// 姓名// 年龄public:Print();// 学号。原创 2025-04-27 21:36:36 · 997 阅读 · 0 评论 -
priority_queue的学习
优先级队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。原创 2025-04-26 21:54:25 · 955 阅读 · 0 评论 -
stack和queue的学习
stack的文档介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作。原创 2025-04-23 21:44:15 · 934 阅读 · 0 评论 -
list的学习
list文档的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2025-04-21 22:12:50 · 1116 阅读 · 0 评论 -
Vector的学习
vector的相关文档对于想深入了解的同学可以参考这个文档进行学习。vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。原创 2025-04-20 21:11:16 · 1171 阅读 · 0 评论 -
模板详细介绍
class 类模板名// 类内成员定义我们以栈为例template<class T> //把DataType改成Tpublic:_size = 0;_size++;int _size;int main()//int类型//double类型return 0;当然st1和st2是2个不同的栈。原创 2025-04-17 20:56:55 · 712 阅读 · 0 评论 -
C和C++的内存管理
new/delete 和 malloc/free最大区别是 new/delete对于==【自定义类型】==除了开空间还会调用构造函数和析构函数。而malloc对于自定义类型会非常乏力。int main()//自定义类型,开空间+调用构造函数初始化//自定义类型,调用析构函数+释放空间free(p1);delete p2;delete p3;A aa1(1);A aa2(2);原创 2025-04-16 21:42:52 · 929 阅读 · 0 评论 -
类和对象(下)
定义时不添加static关键字,类中只是声明3.类静态成员即可用。原创 2025-04-13 21:16:05 · 566 阅读 · 0 评论 -
类和对象(中):第二部分
此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。“++”和“--”不能加const,因为它们内部需要修改成员,“-”可以加const,因为2个日期相减只是它们的值相减,并不会修改成员的值。这种方式不仅可以比较小于,还可以比较其它方式,前提是必须要实现小于等于或者大于等于,其它的就可以直接复用。这样写有一点不足的地方是d1也被改变了,我们想一想i+10时,i应该不会被改变,所以我们可以继续优化一下,调用拷贝构造函数。原创 2025-04-12 19:44:38 · 840 阅读 · 0 评论 -
类和对象(中):第一部分
默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。原创 2025-04-10 22:42:34 · 1151 阅读 · 0 评论 -
类和对象(上)
1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。2.类声明放在.h文件中,成员函数定义放在.cpp成员函数名前需要加类名::一般情况下,更期望采用第二种方式。成员变量命名规则的建议:class Datepublic:_day = day;int _month;int _day;return 0;原创 2025-04-10 22:41:16 · 815 阅读 · 0 评论 -
C++初级入门学习
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。// 大家下去以后自己练习用自己名字缩写即可,如张三:zs// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型int val;//2. 命名空间可以嵌套int a;int b;int c;int d;//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中一个命名空间就定义了一个新的作用域。原创 2025-04-09 22:06:42 · 1069 阅读 · 0 评论