C++学习
文章平均质量分 84
猿来如此~
心中所想,便是远方
展开
-
实时备份系统(项目)
实时备份系统:项目简介项目描述项目设计Windows下的客户端:1.数据管理模块:2.目录监控模块:Linux下的服务端:1.文件工具类:2.文件压缩模块:3.数据管理模块:4.非热点压缩模块:5.网络通信模块:项目源码项目简介包括一个Windows下的客户端和Linux下的服务端,Windows下的客户端负责将需要上传的文件进行上传,然后Linux下的服务端接收上传的文件并且进行热点判断,将非热点的文件进行压缩存储,并且在浏览器端还包括了文件的查看和下载功能项目描述项目的简单描述:1.在Wind原创 2020-09-02 15:21:41 · 459 阅读 · 0 评论 -
C++11新特性
1.列表初始化:在C++11中支持列表初始化,对于C++的内置类型与自定义类型都可以进行列表初始化。{}也不仅仅可以初始化数组,而且可以初始化所有的内置类型与自定义类型,“=”也可以省略,比较特别的是自定义类型进行多个对象的列表初始化需要在模板类中加上参数为Initializer_list类型的构造函数。2.变量类型推导:我们在定义变量的时候,必须知道类型,但是有时候可能我们无法知道类型,或...原创 2020-02-16 16:56:09 · 143 阅读 · 0 评论 -
位图、布隆过滤器及其相关面试题
位图:为了处理大量数据的问题,位图的出现极大的节省了我们进行大数据计算是的时间复杂度以及节省了大量的空间,位图主要利用的是位,使用8位二进制表示8个数字,相当于一个字节就可以表示8个数字,极大的节省了空间,而且在查找的时候的复杂度可以达到O(1)布隆过滤器:我们在给客户推送视频的时候,我们只会推荐客户没有看过的视频,那么我们如何来确定那个视频用户看过了,那个用户没有看过,在这里我们如果使用哈...原创 2020-02-14 15:52:01 · 352 阅读 · 0 评论 -
unordered_map\unordered_set的模拟实现及注意事项
unordered_maptemplate<class K, class V, class KeyofValue, class HF> class unordered_map { typedef pair<K, V> ValueType; typedef HashBucket<K, ValueType, KeyofValue, HF> HT; ...原创 2020-02-11 22:15:51 · 185 阅读 · 0 评论 -
红黑树的插入
红黑树的插入总共不算镜像的话总共五种情况:插入就要做根,即插入之前树中没有结点,插入的这个结点就是m_head的parent第二种就是插入的父亲是黑的,所以不需要改变第三种就是插入的父亲是红的,叔叔也是红的,此时需要的操作是改色,将父亲结点与叔叔结点的颜色变成黑的,将爷爷结点的颜色变成红色,然后继续向上遍历,将所有的出现的这种情况都处理了,如果遇到根就先变红再变黑,即遇到m_head就退出...原创 2019-12-16 11:11:01 · 170 阅读 · 0 评论 -
AVL树的插入、删除
AVL树的插入、删除:bool insert(const T &val) { if (m_root == nullptr) { m_root = new TreeNode<T>(val); return true; } TreeNode<T> * cur = m_root; TreeNode<T> *...原创 2019-12-16 10:43:51 · 212 阅读 · 0 评论 -
数根
数根题目:输入一个数,然后将这个数的每一位加起来,如果得到的数不是10以内的数,就继续进行,知道是10以内的数之后直接输出方法:由于题目中的这个数的位数为1-10001,所以明显不能使用数字,本题中我使用的是C++STL中的string#include <iostream>#include <string>using namespace std;int mai...原创 2019-12-04 23:27:04 · 311 阅读 · 0 评论 -
计算字符串的距离
计算字符串的距离题目描述: 插入、删除、替换每次计算加1.解题思路:动态规划问题:当有任意一个字符串为空的时候,需要编辑的距离就等于另外非空的字符串的长度,当然如果两个都是空的话,编辑距离自然也是空;当两个字符串都不是空字符串的时候,设n[i][j]为将第一个字符串的前i个变为第二个字符串的前j个,一下分四种情况。A. 首先n[i-1][j-1],然后将最后一个字符进行替换B. 同...原创 2019-12-01 14:12:28 · 307 阅读 · 0 评论 -
统计每个月兔子的个数 C++
统计每个月兔子的个数:题目描述:开始有一个兔子,然后这个兔子从三个月后开始生小兔子,小兔子也是三个月之后就可以生,兔子不会死,要求输入月份,输出这个月的兔子数量。解题思路:由题得,兔子分为三种,一个月大小的兔子n1、两个月大小的兔子n2、三个月及三个月以上大小的兔子n3,n3 += n2,n2 = n1,n1 = n3.解释一下就是因为三个月及三个月以上大小的兔子的数量为,前一个月的数量加上这...原创 2019-11-25 18:16:01 · 373 阅读 · 0 评论 -
二叉搜索树的插入、删除
二叉搜索树:就是每一个结点的data值,都大于它的所有左孩子的data,小于所有右孩子的data二叉搜索树的插入删除的模拟:#pragma oncenamespace ljc{ template <class T> class TreeNode { T m_data; TreeNode<T> * m_left; TreeNode<T>...原创 2019-11-19 21:36:07 · 107 阅读 · 0 评论 -
另类加法
另类加法不使用任何算术运算符,进行A与B的加法运算方法:使用按位异或的方法,首先A与B按位异或,然后由于二进制中如果两个数字的相同位置的数都是1的话,加会向前进1位,所以接下来使用A与B按位与的方法,就可以找到两个数都是1 的那一位,然后将此时的这一位向左移动1位,就完成了进位,然后再把得到的两个数进行按位异或,如果此时按位与的时候为0,那么另外一个数中存放的就是这个加法的结果,具体使用的还是...原创 2019-11-15 19:21:19 · 249 阅读 · 0 评论 -
一个顺序数组被左移或者右移n位,求数组中任意数字的下标
题目描述:有一个排好序的数组,例如:[1,2,3,4,5,6,7,8,9],现在将这个数组左移五位变成—[6,7,8,9,1,2,3,4,5],现在用这个得到的数组求其中任意数字的下标,例如求6的下标,返回0,要求算法的复杂度为logn。解题方法:1.使用二分法找到断点的位置;2.从这个断点的位置开始,寻找这个数字,然后哦找到之后%size,就得到了现在这个数字的下标。#include <...原创 2019-11-11 13:53:41 · 422 阅读 · 0 评论 -
拷贝构造函数调用的四个地方
拷贝构造函数什么时候调用:1.使用类的一个对象初始化类的另外一个对象的时候;这个就是最正常的调用拷贝构造函数的地方2.如果函数的形参是类的对象,调用函数时,进行形参与实参的结合时;形参是对象,与实参结合的时候就需要把实参赋给形参,就成了拷贝构造3.函数的返回值是类的对象时,函数执行返回后是调用者时;返回值是类的对象的话,接收返回值的肯定也是对象,所以也相当于拷贝构造函数4.需要产生一...原创 2019-11-09 21:54:24 · 200 阅读 · 0 评论 -
带参数的构造函数被隐式调用
class A{public: A() { printf("0"); } A(int a) { printf("1"); } A& operator=(const A& a) { printf("2"); return*this; }};int test1(){ A al; al = 10; return 0;}上面的代码大家...原创 2019-11-09 21:45:40 · 367 阅读 · 0 评论 -
进制转换(十进制转任意进制)
十进制转任意进制方法:除m取整#include <iostream>#include <stack>#include <string>using namespace std;string Trans(int n, int m){ char str[32] = {' '}; stack<int> s; while (n) { ...原创 2019-11-09 21:39:18 · 257 阅读 · 0 评论 -
排序子序列
问题描述:将一段数组分为若干个排序子序列,排序子序列就是非递增或非递减的排序序列,然后输出至少可以分为几个排序子序列。解决方法:输入数组之后,开始遍历数组,如果数组满足非递增或者非递减,就进入对应的条件判断,然后此时如果i+1的元素依然满足对应的非递增或非递减,就直接i++,然后跳出之后进行count++,这就是一个排序子序列,如果相等的话就直接i++,这样执行下去,直到遍历结束,输出此时的co...原创 2019-11-09 21:36:03 · 571 阅读 · 0 评论 -
逆置字符串
逆置字符串问题描述:将字符串中的元素按单词逆序,标点符号除外。解决方法:首先将整个字符串逆序,使用reverse,然后将每个单词进行reverse,就得到想要的结果了。#include <iostream>#include <string>using namespace std;int main(){ string str1; getline(cin,...原创 2019-11-09 21:33:31 · 216 阅读 · 0 评论 -
C++ 类型转换
C++ 类型转换:1.RTTI 运行时类型识别※typeid判断两个变量的类型是否相同,或者判断变量的类型,可以打印变量的类型(name())2.强制转换:static_cast:静态类型间的转换,包括数字、父子类指针间的转化reinterpret_cast:毫无节操的转化,可以在指针和整型间任意互相转化const_cast:给一个指针或者引用加上或者去掉const属性d...原创 2019-11-06 21:46:44 · 217 阅读 · 0 评论 -
C++智能指针
智能指针:当一个函数中出现大量的return,那么在每一次return前都要加入delete,这种操作非常麻烦且容易出错,智能指针就是用来解决这种问题的。智能指针是一个类模板,主要功能是假装自己是一个指针,通过析构函数,解决上面的问题智能指针就是用来更加方便、安全的使用临时new出来的变量或对象的1.auto_ptr※C++98支持,现在已经废除不用2.unique_ptr3.sha...原创 2019-11-06 21:42:51 · 115 阅读 · 0 评论 -
智能指针shared_ptr循环引用问题及解决(weak_ptr)
智能指针1.智能指针的存在就是为了解决有时候我们申请的空间来不及释放的问题,智能指针会自己去判断是否应该释放,在这一点上比较智能,由此得名。早期的智能指针:C++98 中的auto_ptr (不使用)不使用auto_ptr的原因就是因为在使用中如果进行拷贝构造的时候,前一份的值会被悬空,这个问题就导致我们之后不会使用它C++11 unique_ptr:unique_ptr将auto_ptr...原创 2019-11-05 10:43:08 · 975 阅读 · 1 评论 -
C++ 多态---虚表、菱形继承、多重继承
1.虚表:是一个二级函数指针,只要类包括虚函数,就会在对象的头部包含一个虚表指针(vfptr),虚表就相当于函数指针数组,里面存储的是虚函数的地址,当子类继承父类的时候,会继承虚表,当子类有新的虚函数的时候,会在虚表后面新增新的项,当子类重写父类的虚函数时,会把虚表中原有的那一项覆盖。2.多重继承:1.上面的虚表也是针对单继承的虚表,对于多重继承类说,派生类会有多个基类,写的时候用逗号隔开...原创 2019-10-30 20:28:13 · 347 阅读 · 0 评论 -
虚析构函数
在继承里面有一个比较重要的点,虚析构函数,这个主要就是为了解决派生类指针转化为基类指针的时候出现的析构的问题例如以下代码:#include <iostream>using namespace std;class TestBase{public: ~TestBase() { cout << "TestBase的析构函数" << endl; ...原创 2019-10-29 23:45:01 · 87 阅读 · 0 评论 -
ST算法---任意区间的极值
任意区间的极值1.首先介绍一种方法暴力搜索的方法,这个方法就是比较浪费时间:#include <iostream>#include <vector>using namespace std;vector<int> MinArr(int arr[],int n, int m){ vector<int> v; int i , j; fo...原创 2019-10-27 22:56:41 · 162 阅读 · 0 评论 -
C++基本语法点整理(从内存管理到模板)
C++内存管理:内存区域的两种划分的方法:1.栈、堆、全局区、常量区、代码区栈:系统在用户定义的时候就会自动分配的空间,只要不特殊说明的话,函数也在栈上,栈的增长方式是向下增长堆:动态内存分配可以申请到的空间,无名的空间也在堆上申请,数据量较大的空间也在堆上申请,堆的增长方式是向上增长全局区:直观的看上去,全局区的位置确实在堆的下方,但是全局是可以增长的,最大可以增长到所有的内存,所以全...原创 2019-10-26 16:58:54 · 89 阅读 · 0 评论 -
C++基本语法点的整理(从名字空间到类与对象)
1.命名空间(namespace)a.名字空间可以解决函数,全局变量名重复的问题,包在不同的名字空间里的重复函数,实际上是两个完全无关的函数b.名字空间允许嵌套,内部与外部有关系c.名字空间允许重名,重名的名字空间都会被合并d.就是一个新的作用域e.使用using可以让名字空间对我们可见,注意的是如果两个名字空间有两个完全相同的函数的话,同时using他们两个,让他们对我们可见的时候,这...原创 2019-10-26 16:09:23 · 147 阅读 · 0 评论 -
main函数传参---模拟CP指令
main函数传参–模拟CP指令main函数可以传参数共有三种:多少个参数,每个参数是什么,环境变量#include <iostream>#include <fstream>using namespace std;//main函数可以递归int main(int argc,const char *argv[]){ if (argc != 3) { re...原创 2019-10-23 20:22:42 · 304 阅读 · 0 评论 -
C++的IO流
共分为三种:1.iostream普通的输入与输出,包括cin,cout,cerr,clogcin:从键盘输入 :cin >>cout:输出到屏幕 :cout <<cerr:主要就是不会进入缓冲区,会直接打印内容2.sstream字符串的输入与输出,包括ostringstream,istringstream两种istringstream:从字符串输入到...原创 2019-10-23 19:56:59 · 230 阅读 · 0 评论 -
模板的类型萃取与分离
模板的类型的萃取:主要就是将模板的类型中的系统内置类型与自定义类型分开1.默认参数的方法2.函数法3.模板类的方法(一个一个类型区分)模板的分离编译:对于模板的编译来说,必须将实现与头文件放到一起,要不然的话就会出现如果将实现、main、头文件分开的话,调用实现的话会带着头问价一起调用,但是此时没有类型,会报错,反过来如果调用main函数的时候也会自动与头文件结合到一起,这个时候又没有...原创 2019-10-20 22:28:53 · 154 阅读 · 0 评论 -
计算1+2+3+4+5+……+n(不能使用乘除、for、if、while、switch、case、条件表达式)
本题的主要问题在于被限制了许多方法,但是这何尝不是题目的引导,帮我们也顺带的排除了一些东西,我们只需要使用不在这个限制里面的东西了,可能大家觉得我这句话是废话,但是这样也就可以让我们的方法变得比较固定了,本题提供两个思路1.使用 && 运算符短路解决2.利用C++中的类的静态成员变量的特点方法1. 运算符 && 在前面执行结果是假的时候,后面就不会去执行了,前...原创 2019-10-20 21:21:26 · 653 阅读 · 0 评论 -
二叉树的任意两个结点的最小公共父亲结点
二叉树的任意两个结点的最小公共父亲结点在这里介绍两种方法:中序法、后序法1.后序法:主要利用的是后序遍历的时候,栈里面存放的是此时的这个结点的所有的父亲结点,所以这个时候只要将两个结点的父亲序列都取出来,然后进行对齐,之后两个指针同时移动,当指针所指向的内容相等的时候就找到了那个最小的公共父亲结点TreeNode<T> * lowestCommonAncestor(TreeNod...原创 2019-10-20 19:59:54 · 588 阅读 · 0 评论 -
C++ STL---stack与queue、priority_queue
stack与queue、priority_queuestack与queue、priority_queue是容器适配器,容器适配器的意思就是,以正常的容器作为底层的实现,然后加上以下限制之后就构成了容器适配器的底层实现1.stack:stack的底层默认的容器是deque,只使用了deque的push_back与pop_back两种插入与跳出,当然还有back(),其实底层的容器并不固定,就像...原创 2019-10-18 17:48:37 · 245 阅读 · 0 评论 -
C++ STL---deque
dequedeque的定义是:双端队列,也是一种动态的容器,但是不同于其他容器的一点是,deque可以两端进行扩容,而且deque的实现可以看成是一个二维数组,首先是一个一维的map数组,里面的每个单元又是一个二维的数组,而且deque的主要的有点就是在两端的插入与删除非常的快,并且deque在空间的增长方面也不需要频繁的申请空间,只需要在map这个一维数组的两端进行扩容就行了,大大缩小了空间的...原创 2019-10-18 17:15:46 · 209 阅读 · 0 评论 -
二叉树每层的最大数值
二叉树每层的最大数值具体思路:二叉树的层序遍历的非递归写法使用的是队列来实现,本题只要在上面做适当的增加就可以了首先将二叉树的root进入队列,然后取队首进入一个临时的vector中;分别看该root结点有没有左右孩子,如果有的话就将其入队;队首出队,这个时候的遍历的大小是队列的size的大小,此时size初始值为1;这个内循环结束后,此时本层的结点都在临时的vector中;将这个v...原创 2019-10-18 16:21:07 · 1068 阅读 · 0 评论 -
二叉树的层序遍历
二叉树的层序遍历—按照每一层的样子返回打印其原理是:和正常的二叉树层序遍历的非递归差不多,就是在遍历完要注意要把每一行区分,这里我使用的是每次入队之后找到size,这个size就是此时的本行的元素个数,然后往里面写就行了。#include <iostream>#include <queue>#include <vector>using namespac...原创 2019-10-11 22:02:32 · 96 阅读 · 0 评论 -
逆波兰表达式的计算
逆波兰表达式的计算逆波兰表示说白了就是真实的计算器在处理计算的时候的第二步,第一步当然就是把公式转化成逆波兰表达式*示例:(1+2)3对应的逆波兰表达式:{“1”,“2”,“+”,“3”,“*”}结果就是3*3=9说了这么多,那么如何将一个逆波兰表达式计算出来数值呢?首先我们根据示例的规律得出,首先肯定是遍历,在遍历的过程中,如果发现符号的话,就直接利用符号计算他的前两个数字,那么问题...原创 2019-10-11 21:37:18 · 652 阅读 · 0 评论 -
栈的弹出压入序列
栈的弹出压入序列本题主要是给一个pushV容器,一个popV容器,然后pushV容器是将数字压栈的顺序容器,popV容器是将数字弹出的容器,本题就在检测popV是否可能为pushV的弹出可能下面是我给出的代码示例:本题的具体的思路是:外部循环遍历pushV,将每个元素压入栈中,内部的循环遍历popV,通过检测popV[i]与栈顶元素是否相等,等于的话就pop栈,一直循环到pushV遍历结束,...原创 2019-10-11 21:17:32 · 140 阅读 · 0 评论 -
使用count来数出每个变量存在的个数(使用函数重载,默认参数)
#include <iostream>#include <cstring>using namespace std;struct student{ char name[32]; int age; int classid; bool sex;};bool cmpEql(student a, student b){ return a.age == b....原创 2019-09-04 16:52:15 · 253 阅读 · 0 评论 -
类与对象
构造函数1.无参的构造函数与全缺省参数的构造函数都称为系统默认的构造函数2.系统默认的构造函数只能有一个3.一旦你写了显示的构造函数,系统就不会提供默认的构造函数4.构造函数可以重载析构函数1.功能上与构造函数相反,对象在销毁的时候会调用析构函数2.一个类有且只有一个析构函数,若没有写则系统会自动生成默认的析构函数3.对象生命周期结束的时候,C++编译系统会自动调用析构函数4.与...原创 2019-09-01 15:31:00 · 72 阅读 · 0 评论 -
count函数
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <cstring>using namespace std;struct student{char name[32];int age;int classnid;bool sex;};/*写出函数,用函数重载的方式编写程序,统计出一个以上...原创 2019-08-31 16:42:54 · 1154 阅读 · 0 评论 -
模拟发三人牌——C++
#include <iostream>#include <cstdio>#include <cstdlib>#include <ctime>using namespace std;enum{ SPADES, HEARTS, CLUBS, DIAMONDS, JOKER};//全局变量 g_ 局部静态变量s_ 成员变量m_...原创 2019-08-31 16:42:08 · 392 阅读 · 0 评论