C++
文章平均质量分 62
time~travel
这个作者很懒,什么都没留下…
展开
-
对C++深浅拷贝认识
浅拷贝:就是简单的赋值拷贝操作。深拷贝:在堆区重新申请的空间,进行的拷贝操作。浅拷贝实例:class Person{public: Person() { cout << "Person的构造函数" << endl; } Person(int age, int height) { _age = age; _height = new int(height);//堆上开辟,程序员手动开辟,也需要程序员手动释放 cout << "Person原创 2021-04-07 15:42:27 · 297 阅读 · 3 评论 -
C++每日一题:合并两个有序数组
题目: 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小等于 m + n)来保存 nums2 中的元素。OJ链接.法一:直接合并后排序解析:最直观的方法是先将数组nums2的元素放进数组nums1的尾部,然后直接对整个数组进行排序。class Solution {public: void merg原创 2021-01-18 17:59:56 · 1020 阅读 · 0 评论 -
C++每日一题
题目:给定一个数组 nums 和一个值 val ,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成,OJ链接.法一:暴力法解析:我们来解析一下这个题目的做题思路,他的含义就是让我们删除掉数组中的元素,然后将数组后面的元素跟上来。最后返回删除掉元素的数组长度即可。比如数组长度为 10,里面有2个目标值,我们最后返回的长度为 8,但是返回的 8 个元素,需要排在数组的最前面。那么暴力解法的话则就需要原创 2021-01-16 09:36:46 · 1490 阅读 · 2 评论 -
二叉树进阶面试题 : 二叉树的后序遍历
二叉树的后序遍历,非递归实现思路:后序遍历:左右根1 开始找以cur根的所有的左侧节点入栈,此时cur在3的左侧空的位置,因为3的右侧没有节点,因此最后遍历节点3:2 同理2,1节点。然后4,5节点一次入栈,此时cur在5的左侧开始遍历,没有节点,遍历5的右侧,也没有节点,因此直接遍历5,然后遍历4节点的右侧。3 遍历6节点同5节点一样,最后遍历4节点,于是所有的节点都遍历完,最后遍历根节点1。4 最后栈为空。class Solution {public: vector&l.原创 2020-12-22 20:05:48 · 166 阅读 · 0 评论 -
二叉树进阶面试题 : 二叉树中序遍历 ,非递归迭代实现。
二叉树中序遍历 ,非递归迭代实现。思路:因为中序遍历为左根右,所以先需要遍历以cur为根的二叉树最左侧的节点。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * Tre原创 2020-12-22 17:05:56 · 224 阅读 · 0 评论 -
二叉树进阶面试题 : 二叉树的前序遍历,非递归迭代实现
题目:二叉树的前序遍历,非递归迭代实现题目描述:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。思路:首先前序遍历遍历的次序是根左右。想要将遍历后的节点保存起来,还符合递归的特性,就需要栈来实现。顺着以cur为根的二叉树左侧路径去遍历,并保存每个遍历节点的右子树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr原创 2020-12-22 16:17:15 · 267 阅读 · 2 评论 -
二叉树进阶面试题:二叉树的层序遍历
题目:二叉树的层序遍历题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],返回其层序遍历结果:思路:先对二叉树的根节点从左向右进行遍历,然后将遍历后的结果放到队列中,然后将队列的首元素进行遍历,进行保存。第一次遍历1,2,4:第二次遍历2的左子树3:第三次遍历4的左右子树:第四次遍历:/** * Definition for a binary tree no原创 2020-12-22 15:22:44 · 214 阅读 · 0 评论 -
二叉树进阶面试题:二叉树搜索树转换成排序双向链表
题目:二叉树搜索树转换成排序双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。法一:对BST进行中序遍历,然后将每个节点的地址保存起来。对每个节点进行连接。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(N原创 2020-12-22 10:48:58 · 206 阅读 · 0 评论 -
C++中的继承(下)
C++中的继承(下)1 继承和友元2 继承与静态成员3 复杂的菱形继承即菱形虚拟继承3.1 单继承3.2 多继承3.3 菱形继承(钻石继承)1 继承和友元友元关系不能继承,因为友元不是类的成员,也就是说基类友元不能访问子类私有和保护成员。2 继承与静态成员基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例 。3 复杂的菱形继承即菱形虚拟继承3.1 单继承单继承中子类只有一个基类。单继承子类对象模型:3.2 多继原创 2020-12-18 10:06:22 · 112 阅读 · 0 评论 -
C++中的继承(上)
C++中的继承1 什么是继承?1.1为什么需要继承?1.2 继承的格式1.3共有继承1.4 私有继承1.5 保护继承2 基类和派生类对象赋值转换3 继承类的默认函数4 派生类的默认成员函数1 什么是继承?**继承:**继承机制是面向对象程序设计使代码可以复用的最重要的手段。它允许程序员在保持原有类特性的基础上进行扩展、增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。1.1为什么需要继承?原创 2020-12-17 15:19:32 · 160 阅读 · 0 评论 -
多态笔试题分析
代码:#define _CRT_SECURE_NO_WARNINGS #include <iostream>using namespace std;class A{public: virtual void func(int val = 1) { cout << "A->" << val << endl; } virtual void test() { func(); }};//A的虚表//A::func(int v原创 2020-12-15 11:14:24 · 187 阅读 · 1 评论 -
C++中const型数据小结
几种const类型数据的用法和区别,先总结如下:形式含义Time const t;t是常对象,其值在任何情况下都不能被改变void Time::fun()const;fun是Time类中的常成员函数,可以引用,但不能修改本类中的数据成员Time* const p;p是指向Time类对象的常指针变量,p的值(p的指向)不能改变const Time* p;p是指向Time类常对象的指针变量,p指向的类对象的指不能通过p来改变const Time &t原创 2020-12-06 10:46:31 · 366 阅读 · 0 评论 -
总结:系统什么时候调用构造和析构函数
1 如果在全局范围内定义对象(即在所有函数之外定义的对象),那么它的构造函数在本文件模块中的所有函数(包括main函数)执行之前调用。但是如果一个程序包含多个文件,而在不同文件都定义了全局变量,则这些对象的构造函数的指向顺序是不确定的。当main函数执行完毕或者调用exit函数时(程序终止),则调用析构函数。2 如果定义的是局部变量(在函数体内定义的对象),则在建立对象时调用其构造函数。如果对象所在的局部变量多次被调用,则在每次建立对象的时候都调用构造函数。在函数调用结束、对象释放时调调用析构函数。3原创 2020-12-03 09:44:14 · 5771 阅读 · 0 评论 -
C++之vector深度剖析
C++之vector深度剖析1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.3 vector 增删查改1.2.4 vector 迭代器失效问题2.vector深度剖析及模拟实现1.vector的介绍及使用1.1 vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可原创 2020-11-03 08:35:39 · 2172 阅读 · 0 评论 -
Static修饰类成员/输出运算符和类的成员函数/友元函数
Static修饰类成员C语言: 变量:static修饰全局变量,static修饰局部变量 函数:改变函数链接属性,表明,该函数只能在当前文件中使用C++:变量:static修饰全局变量,局部变量,成员变量是类的属性,布属于某个具体的对象,是所有类对象共享的成员变量静态成员变量不会影响sizeof的大小静态成员变量在类中只是声明,需要在类外进行定义静态成员变量访问:对象.静态成员变量 || 类名::静态成员变量名字静态成员变量不能再构造函数初始化列表的位置进行初始化(因为初始化列表中只能原创 2020-10-18 10:38:38 · 255 阅读 · 0 评论 -
C++中模板讲解
模板1. 泛型函数2. 函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则3. 类模板类模板的定义格式类模板的实例化1. 泛型函数如何实现一个通用的交换函数呢?void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = l原创 2020-10-16 17:46:08 · 310 阅读 · 0 评论 -
C++动态内存管理你知道吗?
1 operator new与operator delete函数new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。new和delete不是函数,是c++中的操作符或者关键字。new/new[]在从堆上申请空间期间,会调用构造函数来对空间进行初始化,也就是创建了对象。delete/原创 2020-10-15 16:48:08 · 212 阅读 · 0 评论 -
对类和对象、面向对象和面向过程、封装自己的理解
1 什么是类?类是对一个相同群体来进行描述的,描述对象都具有那些属性(成员变量),描述对象都具有那些功能(成员函数)。在C++中,定义一个类时,就相当于定义了一个类型,也定义了一个新的作用域。类相当于是一张图纸,在图纸上涉及房子的样式,(类是不占用空间的,而用类定义出来的对象是“占用空间”),即数据是不能放到类中,只能存储到用来类定义出来的对象中。2 什么对象?对象是实实在在存在的,是类的一种具体的表现,是用类类型定义出来的一个变量,数据最终都是放在对象当中的。也就是说对象相当于是用图纸建造出原创 2020-10-14 08:56:48 · 200 阅读 · 0 评论 -
c++构造函数/析构函数/拷贝构造函数/赋值运算符/const成员函数详述
接上篇类和对象的博客,如果读者想要阅读的,可以向前翻阅。1.类的6个默认成员函数当一个类中什么都没有写的时候,称之为空类,空类包含6个默认的成员函数。这6个默认的成员函数不是用户生成的,而是编译器自己生成2. 构造函数2.1 概念对于以下日期类:class Data{public: void SetData(int year, int month, int day) { _year = year; _month = month; _day = day; } void原创 2020-08-15 23:15:09 · 438 阅读 · 0 评论 -
c++类/类的作用域/类的访问限定符及封装/类的实体化/类对象模型/this指针详解
1.面向过程和面向对象初步认识面向过程:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。其中对小程序的解决还是可以的,但缺点是不适合开发大的应用程序,而且对于程序的维护较差,某一小步出错的话,维护起来比较麻烦。面向过程:C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。简单来说,C++中结构体(在C++中称为类)可以用来描述对象的属性信息 + 定义对象的所具有的功能 == 一个对象。2.类的引入C语言中,结构体中只能定义变量,原创 2020-07-31 22:57:24 · 817 阅读 · 0 评论 -
C++基础内容--命名空间/函数重载/引用/内联函数/auto关键字/for循环/指针空值nullptr
命名空间在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题。命名空间的定义定义的时候需要使用namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间:实际就是一个带有名字的作用域(::作用域运算符)命名空间的使用1 直接在成员前增加 N::2 using N::a ,相当原创 2020-07-30 15:23:18 · 357 阅读 · 0 评论