- 博客(25)
- 收藏
- 关注
原创 C++ 异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。
2024-08-17 15:13:04
813
原创 C++ 11 的新增特性
这里在构造str对象时,会采用这里的移动构造的方式,首先构造一个string类型的对象,并且初始化,s是Hello world字符串的右值引用,等到string对象构建完毕,就把 s 中的资源全部换给了这里this指针指向的对象了str,随后的return 还是会创建一个临时对象只不过这个对象是const string类型的临时变量具有常性(将亡值)编译器会继续调用移动构造函数。和 左移右移的概念一样,这里的左值和右值并不是单单的代表着一个数值在等号的左边或者在等号的右边。
2024-08-16 15:03:07
897
原创 C++ bitset(位图)、 布隆过滤器 、哈希切割
将A和B文件分别切割为N分小文件,文件大小不是固定的(编号为0~N),然后将A和B的所有字符串通过哈希函数计算出一个值i,并且将该字符串放入编号为i的小文件中,因为使用的是相同的哈希函数,所以AB中相同的字符串一定会被分到编号为i的小文件中(存在哈希冲突),这个步骤叫切割,切割完后我们只需要把小文件的数据放入set中,若set报错抛异常(bad_alloc),那么说明该文件数据的冲突太多,set放不下了,这种情况则需要换个哈希函数继续对其进行切分,重新对数据进行映射。具体的实现如下所示。
2024-08-11 16:11:46
749
原创 C++ 哈希(unorderedmap/unorderedset)
比如在统计一个字符串中每个小写字母出现的次数,在这里我们可以使用红黑树的map来解决问题,我们也可以使用一个哈希表来解决,将小写字母 a 到 z 的ASCII码值和数组的下标做映射就可以了,ASCII码为97 的 a 存在数组的第一个位置,以此类推。对于开散列而言也是需要扩容的,如果不扩容的话,结构上确实没啥问题,但是每一个节点的链表就会变得很长,在JAVA中,其解决方式为如果一个节点上存放的链表长度大于8,那么就把该链表转化为一个红黑树,这样对于较长链表的情况也不用担心效率的问题了。
2024-08-09 14:08:13
654
原创 C++ AVL树
int _bf;//平衡因子, _kv(kv),_bf(0)AVL树采用了key/value的模型而且采用了三叉结构,不仅有左右节点的指针,还有一个指向父节点的指针,其中_bf是平衡因子用来记录自己右子树高度减去左子树高度的差值。当平衡因子为0时,左树和右树完全平衡当平衡因子为1时,右树高度 - 左树高度 = 1 右树高当平衡因子为1时,右树高度 - 左树高度 = -1 左树高。
2024-08-01 14:00:57
666
原创 C++ map/set 函数用法解析
insert插入时需要插入一个value_type,这是value_type是一个pair的键值对,pair的first是一个key值,second是val值,第一个key是关键字,第二个val是关键字附带的一个val值,key和val的类型可以根据场景来定义。该函数返回一个迭代器,指向找到的元素(如果找到的话,实际上由于查找的是大于给定值的元素,所以返回的迭代器指向的元素是第一个大于给定值的元素,或者如果没有这样的元素,则指向容器末尾之后的位置,即end()迭代器)。用于查找等于给定值的所有元素的范围。
2024-07-30 16:41:04
814
原创 C++(二叉树OJ题)
每次出队列的元素我们都是用一个vector<int>的顺序表去记录每个元素的值。首先题目要求我们需要将各个元素的子集加上括号用前序遍历的方式显示出来,前序遍历二叉树需要用到递归,先出根节点接着是左子树和右子树,在输出子树之前我们给返回的字符串ret加上左括号 '(' ,输出完子树后再加上右括号 ')'。思路:先遍历左子树,并且入栈,等左子树的遍历完毕后,取栈顶元素(栈顶元素为左子树的每一个节点)看此节点的右子树是否为空或者右子树遍历过了,条件满足的话就可以将该元素弹出,如果不满足条件的话就继续遍历右子树。
2024-07-29 18:24:39
319
原创 c++ 二叉搜索树-Binary_Serach_Tree
若左子树不为空,那么左子树上的所有节点的值都小于根节点的值。若右子树不为空,那么右子树上的所有节点的值都大于根节点的值。其左右子树也是二叉搜索树。
2024-07-26 16:01:09
301
原创 C++ 多态
当不同的对象去完成同一件事时,会产生不同的结果。例如学生和普通人一起买票时,学生可以买到学生票但是普通人就只能买到原价票。 在一个类中使用 virtual 关键字修饰的类中的成员函数被称为虚函数。这一点和隐藏很像但是比隐藏更苛刻一些。 虚函数要求父类中的函数名、参数类型、返回值和子类相同。(三同) 但是 有时父子类的返回值可以不相同,但是返回值必须是父子类的指针或者是引用。(协变)1.2.2 虚函数重写的特殊写法 (1)子类继承父类后,子类中的虚函数可以不写关键字
2024-07-21 15:37:21
1134
原创 C++ 模板的进阶使用
模板的定义和声明最好不要分开,就算是分开也要在一个文件中,因为模板在没有接收到具体的参数之前,是不会生成函数或者类的,如果定义和声明分开,那么编译器在编译时发现类的声明中并没有具体描述参数是什么类型的,就不会产生相应的类或者函数,所以会用法报错。结论:模板的定义和声明不要分开写!!!编译其首先会进行预处理操作,把头文件的所有内容展开。
2024-07-17 11:50:57
289
原创 【C++】优先级队列(底层代码解释)
优先级队列是一个容器适配器,他可以根据不同的需求采用不同的容器来实现这个数据结构,优先级队列采用了堆的数据结构,默认使用vector作为容器,且采用大堆的结构进行存储数据。(1)在第一个构造函数中的第三个参数中,less是大堆,greater是小堆(2)第二个构造函数的含义是支持使用容器的迭代器区间进行构造2.1 中介绍了如何建立一个大堆的结构,那么对于不同的场景,我们也可能使用小堆,那么如果库函数中像2.1这么写的话我们就无法使用小堆了,那么为了解决以上的问题我们提出了以下的解决方案。
2024-07-13 19:02:45
812
原创 C++ list容器的底层实现
链表中的数据和前后指针的类型都是模板生成的,可以适配内置类型和自定义类型。这里用struct来定义类的原因是struct默认的成员变量类型都是public,其他函数可以很方便的进行调用。在这里还有一个list_node的构造函数 T()是一个匿名变量,其作用不止是用于存放数据,此外如果调用list_node构造函数时没有写参数的话,这里也会有一个默认的值。在list中,有两个成员变量的存在一个是节点类型的指针_node 和计算节点数量的_size。
2024-07-09 20:53:03
999
原创 C++ string 类
我们在构造string类型的对象时,可以构造不写参数,调用string类的默认构造,也可以在()中 写参数(一般是一个字符串)来进行初始化。以下是string类型的构造函数。
2024-05-11 21:39:27
836
1
原创 C++ 模板
class 类模板名//类名成员定义定义一个类模板: stack并不是一个具体的类型,而是一个模板,要给这个模板传递不同类型的参数才会实例化出不同类型的模板类。int _top;int _size;s1.push(3);s1.print();*/return 0;
2024-05-06 23:03:55
772
原创 C++中的动态内存管理(new、delete)
在定义的时候,new是可以对对象进行初始化的(1)单个内置类型对象的初始化int main()delete a;(2)多个内置类型对象的初始化这里是将10个int类型的元素的初始值都赋为0,如果这里不加()那么初始值都是随机数。注意这里()中不可以写数字,不然会报错!!!!(3)多个内置类型对象的初始化与数组的赋值方法有些相似,没有初始化到的对象的初始值都为0。
2024-05-04 12:41:30
1171
原创 C++类和对象(初始化列表、隐式类型转换、匿名对象、Static成员、内部类)
这三种类型的变量在定义时编译器一定要初始化,这里的自定义类型的成员变量的类中一定没有默认构造函数,但是可能有带参的构造函数。(3)初始化的顺序和类中声明成员变量的顺序有关。(4)构造函数会先运行初始化列表里的内容再走构造函数函数体里的内容二、隐式类型转换和explict2.1 单参数的隐式类型转换。
2024-04-29 23:12:13
1047
原创 C++类和对象(运算符重载案例)
存在的意义: 对于一个自定义类型的栈而言,我们想对其中的元素进行操作是很麻烦的,我们不能直接像使用数组那样去调用栈中的元素。如下所示,我们想要插入或者打印栈的值很麻烦,必须要在类的内部写insert和print函数,来帮助我们实现相应的功能。C++中的vector也是这么实现的。public:perror("malloc失败!");exit(-1);top = 0;"
2024-04-22 22:27:23
1171
1
原创 C++类和对象(默认成员函数、构造函数、析构函数、拷贝构造函数、运算符重载)
如果一个一个类中什么都没有,这样的类被称为空类。空类在代码中看似什么都没有,但其实编译器会在其中生成6个默认的成员函数。默认函数就是我们什么都不写,编译器也会自动生成的函数。默认函数的功能如下图所示,它们能帮助我们完成清理和初始化、拷贝和复制、取地址重载,三个最主要的功能。只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
2024-04-17 00:07:39
1338
1
原创 C++ 入门(引用、内联函数)
引用返回,返回的是return后面这个变量的本体回来,我们不仅可以把它的值赋给别人,它本身的值也是可以改变的,这里我定义了一个数组结构体Array,PosAt函数是用来定位这个Array中数组的第i个元素的,在PostAt 函数返回的是Array中数组的第i个元素的本体。众所周知,我们在使用一个函数时,编译器会在我们的内存中建立一个栈帧,如果在函数中有return关键字的话,会将要返回的值拷贝到寄存器中,在函数调用结束时销毁栈帧后,把寄存器里的值再拷贝给调用函数的地方,这就会非常麻烦(注意销毁栈帧只是。
2024-04-10 23:53:16
950
原创 C++入门(缺省参数、函数重载)
缺省参数是在函数声明或定义时,为形参设置一个默认值,其作用就是在用户调用函数时,没有写实参或者只写了一部分实参的情况下,仍然给形参一个值。return a;int main()//在这里调用函数时因为没有填写实参所以这里的输出值默认为缺省参数0//因为这里在调用的时填写了实参 所以这里的输出值为10return 0;在这个地方缺省参数就像是一个小舔狗一样,在形参接收到实参的值的时候,那么形参就和实参在一起,但是如果实参没有传递值的话,缺省参数就退而求其次和缺省参数在一起。
2024-04-09 17:01:44
919
原创 排序算法(C语言版)直接插入排序
将数组的第一个元素先看成一个有序表,这个表里只有(a[0])这一个元素,随后在数组剩余的部分中(a[1] -> a[n])中依次提取元素(x),取出的元素(x)和有序表中的元素(从后往前从a[n] -> a[0])依次进行比较,并且插入在合适的位置。取出的元素(x)与数组中的元素进行比较的过程中(从数组尾部往前比较 a[n]->a[0] )如果发现,取出的元素(x)小于从数组尾到首之间的任意一元素(a[n]->a[0])的话,较大的元素就往后挪一位。
2024-03-28 20:41:49
239
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人