C++
C++知识点及相关代码例题
ZD_012
这个作者很懒,什么都没留下…
展开
-
【C++】浅析AVL树(高度平衡树)
AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,俩位俄罗斯的数学家G.MAdelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而...原创 2020-05-01 21:24:58 · 629 阅读 · 0 评论 -
【C++】浅析二叉搜索树
二叉搜索树的概念二叉搜索树又称二叉排序树,它或者是一个空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树二叉搜索树操作1、二叉搜索树的查找2、二叉搜索树的插入插入的具体过程如下:a. 树为空,则直接插入b. 树不空,按二叉搜索树性质查找插入...原创 2020-04-23 21:39:12 · 187 阅读 · 0 评论 -
【C++】STL之树形结构的关联式容器 ----- set和multiset
set一、set的介绍set文档介绍set是按照一定次序存储元素的容器。在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序set容器通过key访问单个元素的...原创 2020-04-12 11:29:34 · 221 阅读 · 0 评论 -
【C++】STL之树形结构的关联式容器 ----- map和multimap
根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树形结构和哈希结构。树形结构的关联式容器主要有四种:map、set、multimap、multiset。 这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。关联式容器STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式...原创 2020-04-10 23:28:31 · 293 阅读 · 0 评论 -
【C++】智能指针
为什么需要智能指针?首先我们先分析一下下面这段程序有没有什么内存方面的问题。void _MergeSort(int* a, int left, int right, int* tmp){ if (left >= right) return; int mid = left + ((right - left) >> 1); _MergeSort(a, left, mi...原创 2020-04-09 20:57:44 · 157 阅读 · 0 评论 -
【C++】异常
C语言传统的处理错误的方式传统的错误处理机制:**终止程序,如assert。**缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。**返回错误码。**缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到error中,表示错误。C标准库中setjmp和longjmp组合。实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理...原创 2020-04-06 14:50:53 · 199 阅读 · 0 评论 -
【C++】多态常见面试问题
1. 什么是多态?答:多态,通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。其中多态又分为动态多态和静态多态。静态多态:在程序编译期间确定了程序的行为。动态多态:在程序运行期间,根据具体拿到的对象确定程序的具体行为,调用具体的函数2. 什么是重载、重写(覆盖)、重定义(隐藏)?答:重载:指函数名相同,返回值可以不同,但形参列表(参数个数或类型或...原创 2020-04-04 14:09:41 · 517 阅读 · 0 评论 -
【C++】多态的原理
虚函数表//这里常考一道笔试题:sizeof(Base)是多少?/* 这里 sizeof(Base) = 8。 int类型4个字节 + virtual中含一个指针:4个字节 = 8个字节 (无论有几个虚函数,只有一个指针,指针指向虚函数表)*/class Base{public: //若不加virtual,则sizeof(Base) = 4,此时不计算函数大小 virtual...原创 2020-04-03 13:32:12 · 187 阅读 · 0 评论 -
【C++】多态
多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。多态的定义及实现1、多态定义的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。 比如Student继承了Person,Person对象买票全价,Stud...原创 2020-04-01 19:59:14 · 185 阅读 · 0 评论 -
【C++】复杂的菱形继承及菱形虚拟继承
单继承:一个子类只有一个直接父类时称这个继承关系为单继承。多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承。菱形继承:菱形继承是多继承的一种特殊情况。两个子类继承同一个父类,而又有子类同时继承这两个子类。菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。class Person...原创 2020-03-28 12:28:12 · 171 阅读 · 0 评论 -
【C++】 派生类的默认成员函数
6个默认成员函数,“默认”的意思就是指我们不写,编译器会变成我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢?派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。派生类的operator=必须要调用基类的operator=完成...原创 2020-03-27 16:29:46 · 456 阅读 · 0 评论 -
【C++】继承
继承的概念及定义1、继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。class Person{public: void Print()...原创 2020-03-27 12:55:41 · 354 阅读 · 1 评论 -
【C++】模板进阶
非类型模板参数模板参数分为类型形参与非类型形参。类型形参:出现在模块参数列表中,跟在class或者typename之类的参数类型名称。非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。...原创 2020-03-21 17:12:46 · 142 阅读 · 0 评论 -
【C++】vector 和 list 的对比
vectorlist底层结构动态顺序表,一段连续空间带头结点的双向循环链表随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容。增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低任意位置插入和删除效率高,不需要搬移元素,时间复...原创 2020-03-17 16:50:41 · 242 阅读 · 0 评论 -
【C++】list迭代器失效问题
对于迭代器,我们可以暂时将它理解为指针。迭代器失效指迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除结点的迭代器,其他迭代器不会受到影响。#include<iostream>#include<list>using na...原创 2020-03-17 16:28:08 · 1666 阅读 · 0 评论 -
【C++】模拟实现vector的核心框架接口
vector介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使 用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个...原创 2020-03-17 15:19:57 · 112 阅读 · 0 评论 -
【C++】vector迭代器失效场景
vector内部数据结构:数组。随机访问每个元素,所需要的时间为常量。在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size(...原创 2020-03-12 14:41:32 · 228 阅读 · 0 评论 -
模板初阶
一、泛型编程1、函数重载的缺点:(1)重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数(2)代码的可维护性比较低,一个出错可能所有的重载均出错2、泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的一种。3、模板又包括:函数模板和类模板。二、函数模板1、概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数...原创 2019-01-30 16:29:05 · 133 阅读 · 0 评论 -
关键字static
关键字static在C语言中static是用来修饰变量和函数的。1、修饰局部变量:static改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。即延长了变量的生命周期,但未改变作用域。例:#include <stdio.h>#include <stdlib.h>//代码一//结果为:1 1 1 1 1 1 1 1 1 1v...原创 2020-01-28 16:47:36 · 78 阅读 · 0 评论 -
string类
一、string类的常用接口说明1、string类对象的常见构造函数名称功能说明string()构造空的string类对象,即空字符串string(const char* s)用C-string来构造string类对象string(size_t n, char c)string类对象中包含n个字符cstring(const string& s...原创 2019-02-20 21:26:10 · 191 阅读 · 0 评论 -
类与对象下
一、构造函数1、构造函数体赋值class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; }private: int _year; int _month; int _day;};上述的函数调用之后并不能将其称之为类对象成员...原创 2019-01-20 19:14:01 · 97 阅读 · 0 评论 -
类与对象中
一、类的6个默认成员函数当类为空类时,会自动生产6个默认成员函数。二、构造函数1.概念:构造函数是一个特殊的成员函数,名字与类名相同。在对象的生命周期内只调用一次。2.特性(1)函数名与类名相同(2)无返回值(3)对象实例化时编译器自动调用对应的构造函数(4)构造函数可以重载(5)若类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认函数(6)无参的构造函数和全缺...原创 2019-01-17 19:09:56 · 138 阅读 · 0 评论 -
Date类
日期类:对一个或多个日期进行比较、加、减、自增、自减等运算#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;class Date{public: int GetMonthDay(int year, int month) { int MonthArray[13] = { 0,...原创 2019-01-16 19:37:08 · 142 阅读 · 0 评论 -
类与对象(上)
一、类与对象的初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题C++是基于面向对象的,将一件事拆分成不同的对象,靠对象之间的交互完成二、类的引用C中,结构体只能定义变量,C++中,结构体不仅可以定义变量,也可以定义函数struct Student{ void Print() { cout << _name << "...原创 2019-01-16 19:21:13 · 99 阅读 · 0 评论 -
【C++】单例模式 —— 饿汉模式与懒汉模式
单例模式一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。单例模式有两种实现模式:饿汉模式简单来说就是,不管你将来用不用,程序启动时就创建一个唯一的实例对象//饿汉模式//优点:简单//缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定class Singleton{publ...原创 2020-03-02 13:40:47 · 311 阅读 · 0 评论 -
【C++】实现一个类,计算程序中创建出了多少个类对象
实现一个类,计算程序中创建出了多少个类对象。class A{public: A() { ++_count; } A(const A& t) { ++_count; } static int GetACount() { return _count; }private: static int _count;};int A::_count = 0;...原创 2020-03-01 13:02:25 · 981 阅读 · 0 评论 -
C/C++内存管理
一、C/C++内存分配int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; char* pChar3 = "abc...原创 2019-01-22 18:03:28 · 122 阅读 · 0 评论 -
C++基础知识
一、命名空间使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。namespace关键字就是针对这种问题,起隔离的作用。(1)普通的命名空间namespace N1 //N1为命名空间的名称{ //命名空间的内容即可以定义变量,也可以定义函数 int a; int Add(int left, int right) { return left + righ...原创 2019-01-16 17:26:19 · 125 阅读 · 0 评论