【C++】异常 实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了所以实际中都会定义一套继承的规范体系这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。
【C++】C++11(万能模版、完美转发,可变参数模版,lambda表达式,包装器function+bind绑定) 定义了一个可以调用的对象 / 匿名函数,一般定义在局部,特点是可以深度绑定了局部的数据。lambda表达式,实际上是一个匿名函数,实际上是在定义一个函数(局部的函数)lambda表达式通常是用来定义小函数lambda表达式在局部是很好用的,最特别的就是捕捉列表Add叫lambda表达式的对象 – lambda定义的是一个对象。lambda表达式书写格式:lambda表达式各部分说明:捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数。
【C++】C++11(列表初始化和右值引用) 传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。
【C++】哈希思想的应用——位图、布隆过滤器和哈希切割 位图是直接映射,也不存在哈希冲突,空间消耗几乎没有,并且快,直接是O(1),但是位图只是适合于整形的查找,并不适用于。我们知道,比特位是最小的存储单位,我们的数据类型最小是char,1个字节,占有8个比特位,我们还是存储最小的数据类型比较好,这样便于后面的数据映射。b. 映射冲突到这个编号文件的ip太多 - 但是冲突的太多的话,还是会大量文件存在小文件中,依旧会存在一个小文件太大的情况。其实修改位置的数据和我们惯性思维是有出入的,他对于每一个char类型存的比特位对应的值是从右向左。
【C++】封装unordered_map和unordered_set(用哈希桶实现) 前言: 前面我们学习了unordered_map和unordered_set容器,比较了他们和map、set的查找效率,我们发现他们的效率比map、set高,进而我们研究他们的底层是由哈希实现。哈希是一种直接映射的方式,所以查找的效率很快。与学习红黑树和map、set的思路一样,我们现在学完了unordered_map和unordered_set,本章将模拟实现底层结构来封装该容器! 作者建议在阅读本章前,可以先去看一下前面的红黑树封装map和set——红黑树封装map和set这两篇文章
【C++】哈希——哈希的概念,应用以及闭散列和哈希桶的模拟实现 前面我们一同学习了二叉搜索树,以及特殊版本的平衡二叉搜索树,这些容器让我们查找数据的效率提高到了O(log^2 N)。虽然效率提高了很多,但是有没有一种理想的方法使得我们能提高到O(1)呢?其实在C语言数据结构中,我们接触过哈希表,他可以使效率提高到O(1)。哈希表作为STL中我们所必须学习和了解的容器,是一种一一映射的存储方式,其次它在日常生活中的应用范围也是很广的,例如位图,海量数据筛选中用到的布隆过滤器等等……
【C++】详解AVL树并模拟实现 直接实现key_value的结构 – 三叉链的形式(带父节点)图示如下其中:_bf-----balance factor,代表平衡因子右子树与左子树的高度差(2)AVL树部分功能的实现1、查找从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。最多查找高度次,走到到空,还没找到,这个值不存在。
【C++】map和set的介绍+使用 使用 set 容器,必须引入该头文件#include < set >set的使用文档T: set中存放元素的类型,实际在底层存储的键值对。Compareset中元素默认按照小于来比较Allocset中元素空间的管理方式,使用STL提供的空间配置器管理介绍:1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const)
【C++】详解二叉树进阶OJ题(更深入理解递归和非递归在二叉树的各种结构的应用) 我们在此前的初阶数据结构讲解中已经讲解了部分二叉树的OJ题,当时我们只学习了C语言,其实还有很多进阶的OJ题用C++来写会比较方便和容易理解,所以本章将在讲解完二叉搜索树后来详解不同类型的二叉树进阶OJ题,校招中涉及也比较多哦!
【C++】二叉搜索树(概念、实现、应用) 在分块讲解前,我们要明白,递归要传根节点,但是用户平常使用这些借口并不会传根节点,而是直接调用,所以我们嵌套一层,这样就可以满足双方的需求了。可以在递归的参数中多一个父亲结点,每次递归都更新一下Parent,然后再带到下一层递归。由于没有二叉搜索树的官方库,我们增删查改的实现需要我们自己来完成,见下面的模拟实现。递归这种思想我么你还需要多加理解,下一章将详细讲解OJ题目,加深我们对于递归的理解!采用递归方式的缺点就是如果数的结点个数足够多的时候,就会有爆栈的风险!当出现单边树的情况时,就是〇(N)的情况。
【C++】多态---下(多态的原理) 多态是父类指针指向父类对象就调用父类的虚函数,指向子类的对象就去调用子类的虚函数。所以到底要去调用哪个函数不是按照指针的类型定的,而是去到指向的对象中去查表。指向谁就在谁的虚表中找虚函数对应的地址 – 这是多态ps:同一个类型都是指向一张表的,同一个类型的不同对象它们的虚表都是一样的。(重点)
【C++】多态---上( 概念、条件及性质) (一)多态的概念(二)多态的定义和实现(1)多态的构成条件1、虚函数2、虚函数的重写(覆盖)3、多态的条件(重点)(2)虚函数重写的两个例外1、协变(基类与派生类虚函数返回值类型不同)2、析构函数的重写(基类与派生类析构函数的名字不同)(三)C++11---两个关键字之override和final(1)final的用法(2)override的用法(四)重载、覆盖(重写)、隐藏(重定义)的对比(五)抽象类的概念+使用(1)概念(2)接口继承和实现继
【C++】继承---上(继承的引入及使用详解、切片赋值和作用域) 概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。继承的定义格式:上面我们看到Person是父类,也称作基类。Student(Teacher)是子类,也称作派生类。
【C++】STL之stack、queue的使用和模拟实现+优先级队列(附仿函数)+容器适配器详解 stack文档stack文档1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作。
【C++】STL之list的使用和模拟实现 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。