
C++
D_4_Y_
不后悔且快乐
展开
-
二叉搜索树概念及实现
一.概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树二.二叉搜索树的操作1.查找若根节点不为空:如果根节点key ==查找key,返回true如果根节点key<查找key,在它的右子树查找如果根...原创 2019-04-27 18:08:52 · 167 阅读 · 0 评论 -
多态
一、多态的概念概念:通俗来说,就是多种形态,具体来说就是去完成某个行为,当不同的对象去完成时会产生出不同的状态二、多态的定义及实现多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为在继承中要构成多态还需要两个条件:调用函数的对象必须是指针或者引用被调用的函数必须是虚函数,且完成了虚函数的重写1.虚函数:在类的成员函数前面加virtual关键字2.虚函数的重写:派生类...原创 2019-03-20 16:37:09 · 114 阅读 · 0 评论 -
类与对象(中)
1.类的6个默认成员函数如果一个类里面什么成员都没有,简称为空类。但是空类中并不是什么都没有,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。6个默认成员函数初始化和清理(构造函数主要完成初始化工作,析构函数主要完成清理工作)拷贝复制(拷贝构造是使用同类对象初始化创建对象,赋值重载主要是把一个对象赋值给另一个对象)取地址重载(主要时普通对象和const对象取地址,这两个...原创 2019-03-19 15:10:31 · 124 阅读 · 0 评论 -
继承
一、继承的概念及定义1.概念:继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,产生新的类,称派生类。2.定义定义格式class Student : public Person { public: int _stuid; int _major;}Person是父类,也称作基类;Stu...原创 2019-03-19 14:46:39 · 97 阅读 · 0 评论 -
string类
标准库中的string类1.string类string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作string在底层实际是:basic_string模板类的别名不能操作多字节或者变长字符的序列2.string类的常用接口说明string类对象的常见构造string() /...原创 2019-03-18 20:06:50 · 279 阅读 · 0 评论 -
C/C++内存管理(上)
一、C/C++内存分布计算机的内存是通过分区来进行管理的,但我们主要要了解的有四个区域,分别是:栈去、堆区、数据段(也叫静态区)、代码段栈区:栈是一种先进后出的结构,非静态局部变量/函数参数/返回值一般存在这个区域,栈是向下增长的,函数传参时参数从右到左进栈;堆区:用于动态开辟内存空间,堆是向上增长的;静态区:存储静态变量和全局变量;代码段:存储程序的可执行代码和只读常量;二、C语言中...原创 2019-03-18 19:27:35 · 103 阅读 · 0 评论 -
类与对象(上篇)
1.类与对象的初步认知C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成2.类的引入c语言中,结构体中只能定义变量,在c++中,结构体不仅可以定义变量,也可以定义函数。在c++中更喜欢用class来代替结构体的定义。3.类的定义class className{ ...原创 2018-11-12 21:27:47 · 163 阅读 · 0 评论 -
AVL树
一.AVL树的概念一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树左右子树都是AVL树左右子树高度之差(平衡因子)的绝对值不超过1例如:上面这棵树不是一个AVL树,因为节点16的平衡因子为2,超过了1,此时为了让它变成AVL树,则要进行旋转2.AVL树节点的定义template<class K,class V>struct AVLTreeNode{ ...原创 2019-05-09 16:54:29 · 164 阅读 · 0 评论 -
AVL树的旋转
一.AVL树的旋转由于在插入新节点后可能会导致双亲的平衡因子变为2或-2,此时为了保证该树依然是AVL树,则要进行旋转;我们将AVL树的旋转分为左单旋,右单旋,左右双旋,右左双旋四种情况情况一:左单旋如果新节点插入在较高右子树的右侧,此时进行左单旋在节点16的右侧插入节点后,根节点的平衡因子变为2,此时进行左单旋(降低右子树高度)思想: parent变为subR的左子树,subRL变为...原创 2019-05-09 20:05:53 · 209 阅读 · 0 评论 -
右值引用(移动构造+移动赋值)
一、概念在学习本节的时候,常常会因字面意思而导致错误认知,因此我们首先来理清一些概念左值:一般来讲在等号左边的都是左值,是可以被修改的值右值:在等号右边的值不一定是右值!!!右值是不可以被改变的值,例如常量、临时对象、表达式返回值等左值引用:例如int& lr=a;优点:在传值和传参的位置时使用,可以减少拷贝次数,提高运行效率右值引用:例如int&& rr=a;...原创 2019-07-09 22:55:09 · 1014 阅读 · 0 评论 -
stack和queue
一、stack的介绍和使用1.stack的介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取工作。stack的底层容器可以是任何标准的容器类模板或者其他特定的容器类,这些容器应该支持empty、back、push_back、pop_back等操作2.stack的使用stack (const container_type&am...原创 2019-03-21 09:32:20 · 238 阅读 · 0 评论 -
C/C++内存管理(下)
一、单例模式1.设计模式:设计模式是一套被反复使用、很多人知道的、经过分类的、代码设计经验的总结目的:为了代码可重用性,让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络。...原创 2019-03-21 15:53:25 · 160 阅读 · 0 评论 -
vector
一、vector的介绍和使用1.vector的介绍vector是表示可变大小数组的序列容器vector采用连续存储空间来存储元素,也意味着可以采用下标对vector元素进行访问,和数组一样高效。但是它的大小可以动态改变,而且它的大小会被容器自动处理本质上来讲,vector通过动态分配数组来存储它的元素。当新元素插入时,这个数组需要被重新分配大小。为了增加存储空间,其做法是,分配一个新的数...原创 2019-03-22 12:39:07 · 155 阅读 · 0 评论 -
多态的原理
一.虚函数表class A{public: virtual void Func1() { cout << "A::Func1()" << endl; } virtual void Func2() { cout << "A::Func2()" << endl; } void Func3() { cout <<...原创 2019-04-23 12:19:49 · 248 阅读 · 0 评论 -
模板的分离编译与总结
1.概念一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式2.模板的分离编译假如我们将模板的声明定义分离开,在头文件中声明,源文件中定义:// a.htemplate<class T>T Add(const T& left,const T& right)//a....原创 2019-04-19 10:50:54 · 205 阅读 · 0 评论 -
类型萃取
一、类型萃取(类模板特化应用)Q:如何实现一个通用的拷贝函数?1.使用memcpy函数template<class T>void Copy(T* dst,const T* src,size_t size){ memcpy(dst,src,sizeof(T)*size);}上面实现虽然任意类型的空间都可以拷贝,但是自定义类型有可能涉及到深拷贝,而memcpy是浅拷贝...原创 2019-04-19 09:24:58 · 192 阅读 · 0 评论 -
C++类型转换
一、C语言中的类型转换int main(){ int i=1; double d=i; //隐式类型转换 printf("%d,%.2f\n",i,d); int * p=&i; int ar=(int)p; //显示的强制类型转换 printf("%x,%d\n",p,address);}缺陷:转换的可视性较...原创 2019-04-18 11:32:51 · 192 阅读 · 0 评论 -
map 和 set
一、set1.set的简单介绍set是按照一定次序存储元素的容器set中的元素是不能被修改的,只能支持增、删、查(否则元素可能变为无序的)set中元素的value标识它,并且每个value必须是唯一的2.功能set的底层实际是一个搜索树可以查找关键字在不在(find()接口)排序+去重int main(){ set<int> s; s.insert(3...原创 2019-04-18 09:14:37 · 240 阅读 · 0 评论 -
模板进阶
一、非类型模板参数模板参数分为类类型形参与非类型形参类类型形参:跟在class或者typename之后的参数类型名称非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用浮点数、类对象以及字符串不允许作为非类型模板参数非类型的模板参数必须在编译期就能确认结果二、模板的特化1.概念:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板...原创 2019-04-17 09:30:13 · 120 阅读 · 0 评论 -
智能指针
一、为什么需要智能指针1.malloc出来的空间,没有进行释放,会导致内存泄漏问题2.异常安全问题,如果在malloc和free之间存在抛异常,那么也会出现内存泄漏问题二、智能指针的使用及原理1.RAIIRAII是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等 )的简单技术在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对...原创 2019-04-11 09:12:19 · 110 阅读 · 0 评论 -
异常
一、C语言处理错误机制终止程序,如assert;如发生内存错误、除0错误就会终止程序返回错误码,需要程序员去查找对应的错误,如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误C标准库中setJmp和longJmp组合二、C++异常概念概念:异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接调用者处理这个错误throw:当...原创 2019-03-26 14:01:46 · 129 阅读 · 0 评论 -
list
一、list的介绍及使用1.list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点中,在节点中通过指针指向其前一个元素和后一个元素与其他的序列容器相比,list通常在任意位置进行插入、移除元素的执行效率更好与其他序列式容器相比,list和forward_list最大...原创 2019-03-22 16:00:26 · 117 阅读 · 0 评论 -
析构函数定义为虚函数
Q:析构函数为什么要定义为虚函数?1.我们在之前的学习中都知道,在调用构造函数时先调用基类的构造函数,再调用派生类构造函数;而当调用析构函数时,则要先调用派生类的析构函数再调用基类的析构函数#include<iostream>using namespace std;class A{public: A(){ cout << "A()" << end...原创 2019-07-06 12:12:46 · 1357 阅读 · 0 评论