C++
学苦以至
持之以恒,进取拼搏
展开
-
抽象类不能被实例化,空类可以被实例化区别在哪里
大家都知道空类可以实例化一个对象并且,其大小为一个字节,抽象类不可以实例化一个对象,但是关于抽象类并没有说明为什么其不可以实例化。1. 空类即定义了一个类但是在其中没有定义成员变量和函数,仅仅是写了一个类名称,如下面这种形式:class A{};但是这样的类依然可以实例化一个对象,并且每个对象都有唯一地址空间存放:C++语言标准中规定了这样一个原则:“no object shall have the same address in memory as any other variable”,即任原创 2020-09-17 10:21:48 · 1058 阅读 · 0 评论 -
C/C++复杂指针变量的声明如何解读
1. 指针指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。2.定义一个简单指针int *p; // 代表这是指向int 的指针p,在该地址内存放的数据类型为整型int。int * func(int i,int j); //func是一个函数表示函数的返回值为int *int (*func) (int a, int原创 2020-09-05 14:19:49 · 251 阅读 · 0 评论 -
链表两数相加leetcode2
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807计算每一位的相加结果sum,并且使用flag保存进位信息,如果有进位信息su原创 2020-09-04 22:26:38 · 127 阅读 · 0 评论 -
leetcode54 螺旋矩阵按照一定规律输出矩阵的值
以周围四条边为边界,每次遍历一条边就让该条边的边界值内缩一,当两条对边的边界值相等时就表明遍历完成即可输出结果res代码如下#include<iostream>#include<string>#include<memory>#include<vector>#include<algorithm>using namespace std;class Solution {public: vector<int> spi原创 2020-09-04 21:09:39 · 105 阅读 · 0 评论 -
二叉树的概念及其排序方法
1. 树树是数据结构中的一种.结点是数据结构中的基础,是构成复杂数据结构的基本组成单位树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:1)有且仅有一个特定的称为根(Root)的结点;2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。此外,树的定义还需要强调以下两点:1)n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点。2)m&原创 2020-08-30 22:34:18 · 7038 阅读 · 0 评论 -
面试题美团默契游戏
原题:(默契游戏)小明和小红分别从整数区间[1,m]之间选取一个数,小明选取的数为l,小红选取的数为r,然后根据选取的数为边界判断数组中的数是否保留,同时对保留后的数组也有要求,要求如下要求:选取的l<=r;对于序列中的元素保留原则:元素x不能取在[l,r]之间的数,即0<x<l,r<x<m+1;要求保留下来的子序列单调不下降。非递减子序列。输入要求:输入第一行为两个正整数m,n,其中m为序列元素最大值,n为序列的长度[1<=n,m<=10000原创 2020-08-29 19:58:42 · 342 阅读 · 0 评论 -
面试笔试题中的LRU算法及其缺页次数替换
1 LRE算法LRU(最近最久使用法)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。每次更新数据时,就想数据中最久没有被使用的数据进行替换。如果是已有的数据那么就将该数据放到最前边。添加元素:1.新元素1)先判断链表中元素是否已满,如果元素已满,将最后的一个元素删除并将新元素放到链表最前边。因为链表最后一个数据表示的该数据最长时间未被使用。2)链表未满,将元素插入到链表的开头。2.非新元素:将链表中该元素直接覆盖,并且将该元素提原创 2020-08-29 14:03:25 · 3280 阅读 · 0 评论 -
leetcode 字母异或词的判断以及分组
问题1:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。:示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false说明:你可以假设字符串只包含小写字母。判断思路:根据排序后的结果是否相同,判断是否符合要求。因为字母相同只是顺序不同,排序后的结果是一样的// 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词原创 2020-08-29 10:43:30 · 226 阅读 · 0 评论 -
题目: 有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。(
问题原型:有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。n<1000实质:约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)使用数组,用01标记是否在队列中,0是退出队列,1是在队列中。#include<iostream>using namespace std;int find(int n) // 传入原创 2020-08-28 22:18:36 · 1831 阅读 · 0 评论 -
动态规划--背包问题
0-1 背包问题N件物品 背包最大重量W,每个物品都有value和w每个物品都只能取一次,重量不超过W的情况下求价值最大。0<N,W<10000<wi,valuei<1000输入:N WN行:重量和价值wi valuei示例:4 51 22 43 44 58思路:先用表格即二维数组的想法规划一下,将没种情况都列举出来,最后找到最大值即可。f[i][j] 表示在j的重量下此时,只考虑前i个物品的最大价值此时俩种情况:1.不算i物品,此时f原创 2020-08-26 21:57:57 · 108 阅读 · 0 评论 -
经典排序算法及其代码实现
1. 冒泡排序2. 快速排序原创 2020-08-08 22:38:00 · 252 阅读 · 0 评论 -
C++三大特性,七项原则
1. C++面向对象三大特性1. 封装封装:把客观事物抽象为类,并且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏。类将成员变量封装在类的内部,根据需求设置访问权限,通过成员函数管理内部状态。2. 多态多态简单讲可以概括为“一种接口,多种方法”,多种形态,程序在运行过程才决定要调用的函数,是核心概念。ps:重载,重写,重定义的区别:重载,同一作用域的同名函数1.同一个作用域2.参数个数,参数顺序,参数类型不同3.和函数返回值,没有关系4.const也可以作为原创 2020-08-07 22:45:06 · 785 阅读 · 0 评论 -
DFS 深度优先搜索 迷宫回溯问题,能否回到迷宫原地问题
问题描述:牛牛在一个迷宫中,迷宫有n个格子,有 m条通道,每条通道连接两个格子 u, v,编号为 u 的格子与编号为 v 的格子可互相到达,每人每条通道只能走一次。牛牛想知道,他是否能从 11号格子出发回到 1 号格子。输入第一行给定两个整数 n , m 。接下来 m 行,每行有两个整数 u,v 。//1≤n≤100,000 0≤m≤100,000 0≤L≤m//m对 u, v 互不相同//输出//若能回到 1号格子则返回Yes,否则返回No。问题思路:深度优先搜索算法从顶原创 2020-07-31 20:35:22 · 254 阅读 · 0 评论 -
面试题C++编程 车站建造问题,间隔要求必须为1或者为某个质数,求最小建造数量
题目描述有108个村庄排在一条公路上,依次编号为0~108-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0~an-1,其中保证a0=0.现在需要建设车站,有两个要求必须被满足:1、每个有牛牛居住的村庄必须修建车站。2、相邻车站的距离必须为1或为某个质数。现给出n和a数组,求需要建设车站的最小数量。示例 13,[0,7,11]输出4说明在0,7,8,11处建造车站,差值分别为7,1,3,符合要求编程思想:根据题意可知,最少建造数量:为n原创 2020-07-31 15:44:08 · 234 阅读 · 0 评论 -
C++STL算法(2)
算法概述算法主要是由头文件algorithm、 functional、numeric组成。algorithm :是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等…numeric :体积很小,只包括在几个序列容器上进行的简单运算的模板函数.functional :定义了一些模板类,用以声明函数对象。常用遍历算法遍历算法 遍历容器元素@param beg 开始迭代器@param end 结束迭代器@param _callback 函数原创 2020-07-23 22:27:18 · 120 阅读 · 0 评论 -
C++STL算法(1)概述
1. 函数对象重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。注意:1.函数对象(仿函数)是一个类,不是一个函数。2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。分类:假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为“一元仿函数”(unary functor);相反原创 2020-07-23 13:42:26 · 363 阅读 · 0 评论 -
C++STL常用容器(6)总结
STL容器使用时机容器特征vectordequelistsetmultisetmapmultimap典型内存结构单端数组双端数组双向链表二叉树二叉树二叉树二叉树可随机存取是是否否否对key而言:不是否元素搜寻速度慢慢非常慢快快对key而言:快对key而言:快元素安插移除尾端头尾两端任何位置----vector的使用场景:比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上原创 2020-07-18 21:59:31 · 131 阅读 · 0 评论 -
C++STL(5)常用容器介绍(四)list、set、map容器
1. list概 述链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移原创 2020-07-18 21:50:35 · 426 阅读 · 0 评论 -
C++STL(4)常用容器介绍(三)stack、queue
1. stack容器简介堆栈:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。有元素推入栈的操作称为:push,将元素推出stack的操作称为pop.stack没有迭代器Stack所有元素的进出都必须符合”先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。Stac原创 2020-07-18 15:43:50 · 194 阅读 · 0 评论 -
C++STL 案例
有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。创建五名选手,放到vector中遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分打分存到deque容器中sort算法对deque容器中分数排序,pop_back pop_front去除最高和最低分deque容器遍历一遍,累加分数,累加分数/d.size() //5. person.score = 平均分#include<iostream>#includ.原创 2020-07-16 19:31:28 · 195 阅读 · 1 评论 -
C++STL(3)常用容器介绍(二)deque
1. deque容器基本概念Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。Deque容器和vector容器最大的差异,一在于deque允许使用常数项时间对头端进行元素的插入和删除操作。二在于deque没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像vector那样原创 2020-07-16 19:23:35 · 157 阅读 · 0 评论 -
C++STL(3)常用容器介绍(二)vector
1. vector概念vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个大块头的array了。Vect原创 2020-07-16 18:33:01 · 169 阅读 · 0 评论 -
C++STL(2)常用容器介绍(一)string
0 头文件介绍#include//string容器#include//vector容器#include//deque容器#include//algorithm头文件是C++的标准算法库,它主要应用在容器上。//因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性。 因此,任何数据结构都能使用这套算法库,只要它具有相应的迭代器类型。1. string 容器介绍C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开原创 2020-07-16 15:57:42 · 163 阅读 · 0 评论 -
C++STL(1) 简介
1 .STL概念STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。STL(Standard Template Libr原创 2020-07-16 11:16:21 · 119 阅读 · 0 评论 -
C++基础(15)文件读写
文件流类和文件流对象输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。在实际应用中,常以磁盘文件作为对象。即从磁盘文件读取数据,将数据输出到磁盘文件。和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操作,他们分别是ifstream、ofstream、fstream,其中fstream类是由iostream类派生而来,他们之间的继承关系见下图所示:由于文件设备并不像显示器屏幕与键盘那样是标原创 2020-07-09 22:20:56 · 142 阅读 · 0 评论 -
C++基础(14) 异常
1. 概念Bjarne Stroustrup说:提供异常的基本目的就是为了处理上面的问题。基本思想是:让一个函数在发现了自己无法处理的错误时抛出(throw)一个异常,然后它的(直接或者间接)调用者能够处理这个问题。也就是《C++ primer》中说的:将问题检测和问题处理相分离。一种思想:在所有支持异常处理的编程语言中(例如java),要认识到的一个思想:在异常处理过程中,由问题检测代码可以抛出一个对象给问题处理代码,通过这个对象的类型和内容,实际上完成了两个部分的通信,通信的内容是“出现了什么错误”原创 2020-07-09 22:13:33 · 160 阅读 · 0 评论 -
C++基础(13)输入输出流
1. 概念程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。C++输入输出包含以下三个方面的内容:对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何原创 2020-07-09 21:21:51 · 408 阅读 · 0 评论 -
C++使用模板对数组进行封装
模板头文件 .hpp#pragma once#include<iostream>#include<string>using namespace std;template<class T>class Myarray{public: explicit Myarray(int spacedate)//explicit 防止隐式类型转换 myarray arr =10; { this->max =spacedate; this->Pa原创 2020-07-09 10:49:16 · 164 阅读 · 0 评论 -
C++基础(11)类模板
1. 类模板类模板和函数模板的定义和使用类似,我们已经进行了介绍。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。类模板用于实现类所需数据的类型参数化#include<iostream>#include<string>using namespace std;//类模板和函数模板的定义和使用类似,我们已经进行了介绍。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。//类模板用于实现类所需数据的类型参数化template<class T1,原创 2020-07-09 10:45:02 · 942 阅读 · 0 评论 -
C++基础(10) 函数模板
1 .模板概念c++提供了函数模板(function template.)所谓函数模板实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板 。 凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。c++提供两种模板机制:函数模板和类模板类属 - 类型参数化,又称参数模板总结模板把函数或类要处理的数据类型参数化,表现为参数的多原创 2020-07-09 10:02:38 · 244 阅读 · 0 评论 -
C++多态练习
计算机小案例:利用多态实现±*/四则运算/*静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。*/#include<iostream>using namespace std;//面向对象程序设计一个基本原则:开闭原则(对修改关闭原创 2020-07-07 16:15:12 · 268 阅读 · 0 评论 -
C++基础(9)多态
1. 多态1.1 多态基本概念多态是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。多态性(polymorphism)提供接口与具体实现之间的另一层隔离,从而将”what”和”how”分离开来。多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性,项目不仅在最初创建时期可以扩展,而且当项目在需要有新的功能时也能扩展。c++支持编译时多态(静态多态)和运行时多态(动态多态),运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。静态多态和动态多态的区别就是函数地址原创 2020-07-07 15:37:20 · 124 阅读 · 0 评论 -
C++基础(8)继承和派生
1. 继承1.1 继承概述继承的意义: c++最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不仅拥有旧类的成员,还拥有新定义的成员。一个B类继承于A类,或称从类A派生类B。这样的话,类A成为基类(父类), 类B成为派生类(子类)。派生类中的成员,包含两大部分:一类是从基类继承过来的,一类是自己增加的成员。从基类继承过过来的表现其共性,而新增的成员体现了其个性。1.2 派生类定义派生类的代码格式: Class 派生类名 : 继承方式 基类名{原创 2020-07-07 14:18:23 · 222 阅读 · 0 评论 -
C++字符串封装
头文件实现:#pragma once#ifndef MYCHAR_S_H#define MYCHAR_S_H#include<iostream>#include<string>using namespace std;class myChar_s{ //重载<<输出符号,输出字符串 friend ostream& operator<<(ostream &cout,myChar_s& p); //重载输入>>原创 2020-07-06 22:36:13 · 388 阅读 · 0 评论 -
C++ 数组类封装
数组类封装头文件:#pragma once #ifndef MYARRAY_H#define MYARRAY_H#include<iostream>#include<string>using namespace std;class MyArray{public: //初始化 //无参构造函数 MyArray(); //有参构造函数,根据用户指定数量构造数组 MyArray(int num); //通过接口对函数进行操作 //根据位置插入数据 voi原创 2020-07-06 22:33:43 · 738 阅读 · 0 评论 -
C++基础(7)常见运算符及其优先级
原创 2020-07-06 22:27:47 · 173 阅读 · 0 评论 -
C++基础(6)运算符重载
1 运算符重载1.1 运算符重载基本概念运算符重载(operator overloading)只是一种”语法上的方便”,也就是它只是另一种函数调用的方式。在c++中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只是函数的名字由关键字operator及其紧跟的运算符组成。差别仅此而已。它像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。语法:定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被重载的运算符。函数的参数中参原创 2020-07-06 22:19:30 · 546 阅读 · 1 评论 -
C++基础(5)类与对象(二)
1. 静态成员在类定义中,它的成员(包括成员变量和成员函数),这些成员可以用关键字static声明为静态的,称为静态成员。不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。静态成员变量在构造时跟其他非静态成员变量不在同一个内存空间。1.1 静态成员变量静态成员变量在构造时跟其他非静态成员变量不在同一个内存空间。静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。静态成员变量必须在类中声明,在类外定义。静态数据成员不属于某个对象,在为对象分原创 2020-06-30 22:07:28 · 209 阅读 · 0 评论 -
C++基础(4)类和对象(一)
1. 类和对象1.1 类的封装类是对象的抽象化,而类的封装特性包含两个方面,一个是属性和变量合成一个整体,一个是给属性和函数增加访问权限。封装把变量(属性)和函数(操作)合成一个整体,封装在一个类中对变量和函数进行访问控制访问权限在类的内部(作用域范围内),没有访问权限之分,所有成员可以相互访问在类的外部(作用域范围外),访问权限才有意义:public,private,protected在类的外部,只有public修饰的成员才能被访问,在没有涉及继承与派生时,//封装两原创 2020-06-30 17:39:49 · 226 阅读 · 0 评论 -
C++基础(3)函数
1. 内联函数(inline function)c++从c中继承的一个重要特征就是效率。假如c++的效率明显低于c的效率,那么就会有很大的一批程序员不去使用c++了。C语言中如果多次使用一个简单计算那么就会使用宏定义一个计算,计算写成宏,而不是函数,这样做的理由是为了执行效率,宏可以避免函数调用的开销,这些都由预处理来完成。但是在C++这就会造成一些问题第一个在c中也会出现,宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误。第二个问题是c++特有的,预处理器不允许访问类的成员,也就是说预处理原创 2020-06-30 14:59:12 · 94 阅读 · 0 评论