- 博客(126)
- 收藏
- 关注
原创 设计模式---观察者模式
观察者模式首先看一下他的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。然后看一下菜鸟教程的有缺点优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生
2021-11-10 16:59:23
392
原创 设计模式----单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。使用场景:1、要求生产唯一序列号。2、WEB 中的计数器,不用每次刷.
2021-10-28 16:39:04
278
原创 C++11 auto的应用
auto 自动类型推导C++11之前和c语言 auto用来声明变量的存储类型(自动变量 栈区)在编译期间 编译器能够根据变量或者表达式推导七类型auto 与 const 时: 普通数据在推导时const属性会被抛弃 但是指针或者引用有const时 自动推导时不会抛弃auto的限制: 1.不能用于函数的参数列表 2.auto不能作用于类的非静态成员 3.auto 关键字不能定义数组 4.auto不能作用于模板参数auto的应用 1.for循环 for(auto& var:
2021-10-19 11:00:44
353
原创 C++ 容器详解
首先说一下六大组件:算法,容器,迭代器,仿函数(函数对象),分配器,适配器简述:线性容器:vector(向量): 好比C语言中数组 顺序表 seqtable(a)内存连续 支持[]运算符 下标访问(b)动态内存管理 自动扩容(c)通过分配器来管理动态内存 预分配内存空间 减少动态内存管理的额外开销(d)可以随机位置做插入和删除,但只有在接近末尾进行插入和删除时才是高效的预分配内存和初始化vector v3(10); //10个int元素,初始值为0vec
2021-10-17 10:05:27
3385
1
原创 PAT 卖个萌
卖个萌注意:在之前的1024. 科学计数法 (20)(C语言实现)中,我使用了格式化字符串"%[…]",这种字符串的作用类似于"%s",但是后者会读取字符串到空白字符(空格、换行、制表符等等),前者使scanf读到后面的字符,相当于用户可以自定义scanf的行为。#include <stdio.h>int cnt(char arr[][5]){ char c; int i = 0; while((c = getchar())!='\n') { if(c == '[')
2021-10-04 10:55:34
143
原创 STL全特化 偏特化 成员特化
模板有两种特化,全特化和偏特化(局部特化)模板函数只能全特化,没有偏特化(以后可能有)。模板类是可以全特化和偏特化的。全特化:template<>class cla_template_name<特化类型>{ };成员特化:template<>ret_type cla_template_name<特化类型>::memb_func_name(arglist,..){ }类模板在实例化时一定要显示类型实例化类模板可以有缺省类型,
2021-10-03 09:38:37
258
原创 STL模板实现stack
#include <iostream>#include <stdexcept>using namespace std;//类模板template<typename T=int>class Stack{private: T *elems; size_t size; size_t cap;public: Stack(size_t cap = 10):cap(cap){ elems = new T[cap]; size = 0; } ~Stac
2021-10-02 10:01:31
175
原创 C++类模板的基础
类模板不能根据参数进行类型推导实例化模板类,只能显示#include <iostream>using namespace std;template<typename T>T msum(T a,T b){ return a+b; }int main(){ cout << msum(1,2) << endl; //cout << msum(1,3.1) << endl; //不能根据实参进行类型推导 cout &l
2021-10-01 10:10:39
138
原创 C++ STL实现sort
sort#include <iostream>#include <algorithm>using namespace std;template<typename T>void mswap(T& t1,T& t2){ T t = t1; t1 = t2; t2 = t;}template<typename T>void msort(T elems[],size_t cnt){ for(int i=0;i<cnt
2021-10-01 10:02:52
158
原创 PAT 复数乘法
复数乘法注意:C语言的格式化输出虽然能正常四舍五入,但是有一点貌似和一般的自然写法不同:很接近0的负数四舍五入之后不输出0.00,而是-0.00,这点就要特殊照顾了。#include <stdio.h>#include <math.h>int main(){ double r1,p1,r2,p2; int ret = 0; scanf("%lf%lf%lf%lf",&r1,&p1,&r2,&p2); double shi1,shi
2021-09-28 08:46:04
197
原创 C++ 标准模板库STL初理解
定义标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要表出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说
2021-09-27 09:01:46
152
原创 c++实现成绩管理系统
成绩管理系统 1.增加学生信息 2.删除学生 3.修改学生 4.列出 5.查找 0.退出 把学生信息保存到文件#include <iostream>#include <fstream>#include <algorithm>#include <cstring>#include <vector>using namespace std;class Stu{private: int no; string name;
2021-09-26 14:41:40
626
1
原创 PAT 螺旋矩阵
螺旋矩阵分析:基本想法是首先将输入的数字存储在数组中,然后对数组进行递减排序。开一个二位数组,将数字依次填入二位数组中,最后打印二位数组#include <stdio.h>#include <string.h>#include <math.h>int com(const char *ps1,const char *ps2){ int *p1 = (int *)ps1; int *p2 = (int *)ps2; return *p2-*p1;}
2021-09-25 18:05:49
151
原创 C++异常处理
C++的异常处理1.通过返回值表达错误( 如果是调用系统函数出错 设置全局的errno )层层判断返回值,流程变得繁琐错误处理和正常逻辑 代码是混在一起局部对象能够正常析构2.通过setjmp/longjmp远程跳转可以一步到位进行错误处理,流程简单#include <iostream>#include <cstdio>#include <csetjmp>using namespace std;class A{public: A(){ c
2021-09-24 10:42:44
167
原创 PAT 数列的片段和
数列的片段和分析:主要是精度损失问题。在大量的数累加之后浮点数就会损失精度。计算的过程越多,误差累积越大。使用浮点型进行大量计算时要尽可能地减小计算。#include <stdio.h>int main(){ int N; scanf("%d",&N); int i; long double sum = 0,num = 0; for(i = 1;i<=N;i++) { scanf("%llf",&num); sum += i*num*(N-i
2021-09-23 14:58:18
125
原创 C++ 重载 覆盖 隐藏 详细区分
重载:重载在之前已经讲过,这里不在赘述详细的link.在同一个作用域下,函数名相同,参数列表不同即构成重载条件:必须在同一个作用域(类)下函数名相同参数列表不同: 参数类型和参数的个数不一样 对于指针和引用常属性不一样也构造重载与返回值类型无关与函数是否是虚函数无关在编译时,根据调用时传递的实参类型和个数来绑定调用的函数,静态绑定覆盖(重写):说起覆盖先说一下虚函数在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返
2021-09-22 12:03:24
146
原创 C++ 继承解析
面向对象编程三大特征:封装、继承、多态定义继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展。原来的类称为基类,继承的类称为派生类,他们的关系就像父子一样,所以又叫父类和子类。该派生类拥有另外一个类的所有的属性和方法如果一个类继承另外一个类,那么该类拥有另外一个类所有的属性和方法人类 人类 基类 父类
2021-09-22 10:32:54
217
原创 C++中普通指针 vs 成员函数指针 vs 成员属性指针
什么是指针?指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var-name;在这里,type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。普通指针:数据类型 *指针变量;成员属性指针:定义: 数据类型 类
2021-09-22 09:13:07
280
原创 PAT 数字加密
数字加密思路:(1)首先需要注意的是加密是从低位到高位进行计算的,并且有一个位数多的话,比较短的那一个对应位按0来计算。(2)处理的时候从最低位开始,将字符串反转比较好处理,然后遍历,逐个位数来判断。需要注意的是循环的i从0开始,所以奇数位和偶数位是相反的。#include <stdio.h>#include <string.h>int main(){ char num[] = "0123456789JQK"; int i,a,b,c; char arr[10
2021-09-22 09:07:05
181
原创 C++面试题---String类实现
C++的String在C语言里,字符串是用字符数组来表示的,而对于应用层而言,会经常用到字符串,而继续使用字符数组,就使得效率非常低.所以在C++标准库里,通过类string从新自定义了字符串。#include <iostream>#include <cstring>using namespace std;//写一个string类class String{private: char *m_str; //指针成员public://构造函数 String
2021-09-21 13:55:01
335
原创 C++ 拷贝赋值
拷贝赋值函数当存在的两个同类型的变量进行赋值操作时,会调用拷贝赋值函数 如果一个类没有实现拷贝赋值函数,则编译器会自动生成一个拷贝赋值函数,默认实现是浅拷贝赋值如果需要实现深拷贝赋值,则需要手动实现注意:当类持有其它资源时,例如动态分配的内存、打开的文件、指向其他数据的指针、网络连接等,默认的赋值运算符就不能处理了,我们必须显式地重载它,这样才能将原有对象的所有数据都赋值给新对象。拷贝赋值函数形如:class CLA_NAME{ //拷贝赋值函数 CLA_NAME& opera
2021-09-21 10:43:16
861
原创 PAT 编程团体赛
编程团体赛分析: 看看输入格式就能知道,输入先取编号和成绩,然后编号直接由‘-’得到团队编号,然后直接数据进行处理最后列表中取到最大的值#include <stdio.h>int main(){ int n,score,num,group,sum[1001] = {}; scanf("%d",&n); int i; for(i = 0;i<n;i++) { scanf("%d-%d %d",&group,&num,&score);
2021-09-21 10:04:35
886
1
原创 C++ 拷贝构造
拷贝构造函数定义拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。是特殊的构造函数如果一个类没有添加拷贝构造函数,那么编译器将自动生成一个拷贝构造函数,实现是浅拷贝如果一个类需要实现深拷贝,则需要
2021-09-21 10:01:20
793
原创 PAT 划拳
划拳#include <stdio.h>int main(){ int jhan,jhua,yhan,yhua,N,cntj = 0,cnty = 0; scanf("%d",&N); int i; for(i = 0;i<N;i++) { scanf("%d%d%d%d",&jhan,&jhua,&yhan,&yhua); if(jhan+yhan == jhua && jhan+yhan == yhua
2021-09-21 09:47:40
119
原创 C++ 析构函数
析构函数//当一个对象消亡(消失,离开了生命周期) ,即当对象的生命周期结束时,撤销类对象时候会自动调用析构函数~CLA_NAME(void){ };1)对象在生命期结束,撤销类对象时会自动调用析构函数。如果在一个函数中定义了一个非静态局部对象,那当函数调用结束时候,对象被释放,在对象被释放前调用析构函数。 函数中的静态局部对象在函数调用结束时候对象并不释放,因此不调用析构函数。静态局部对象或全局作用域的对象只有在主函数结束时候,才会调用析构函数。2)如果用new运算动态地建立一个对象
2021-09-20 15:56:33
376
原创 PAT快速排序
快速排序分析把原数列和排序排好的数列中数字位置进行比较 如果位置不变而且大于所有在他前面的数字 那么这个数字就是主元#include <stdio.h>int com(const char *ps1,const char *ps2){ int *s1 = (int *)ps1; int *s2 = (int *)ps2; return *s1-*s2;}int main(){ int i,N,cnt = 0,max = 0; scanf("%d",&N);
2021-09-20 15:39:12
146
原创 C++中的this指针
this指针在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。在成员函数中,可以直接访问成员属性 和 调用 成员方法在类外面调用成员方法 对象.成员方法名(实参列表);在所有的成员函数(构造函数)中,都隐含了一个参数this, this是一个该类类型的指针 对象.成员方法名(实参列表); ---> 成员方法名换名之后(&对象,实参列表) 成员方法名换名之后(类型 *this,
2021-09-20 15:21:19
204
原创 C++ 实例化对象
实例化对象:意味着一定有调用构造函数 实例化就是给,数据成员分配内存,构造对象。对象的成员函数和普通函数的区别就是,成员函数有个指向当前对象的this指针,可以访问对象的成员变量,其依赖于对象。静态函数就更像一个全局函数,没有this指针,可以通过类名直接访问,可以被对象的成员函数访问,静态函数只能访问类的静态成员。这些可访问属性是由编译器来实现的,编译之后就没有对象、成员这些东西了,都是数据和方法。一.在栈区实例化对象1.调用无参构造函数实例化对象 类型名 --- class/struct
2021-09-20 15:10:58
2794
原创 PAT 火星数字
火星数字分析:1.首先根据首位字符判断是地球数字还是火星数字,然后分别写处理方法;2.这里稍微有难度的就是对火星数字的处理,首先先分类,分成了小于等于4位的输入和4位以上的输入。前者有可能是0-12,也有可能是13的整数倍的数,这里需要注意的是:火星数字除了单独是0的时候写0,只要高位数字有数,个位数字如果是0就省略不写。#include <stdio.h>#include <string.h>#include <ctype.h>int main(){
2021-09-17 09:41:07
170
原创 C++类型转换大汇总
隐式类型转换可以用单个实参来调用的构造函数定义了从形参类型到该类型的一个隐式转换。首先要单个实参,你可以把构造函数colour的默认实参去掉,也就是定义一个对象必须要两个参数的时候,文件编译不能通过。然后满足这个条件后,系统就知道怎么转换了要注意的是:只存在一个用户定义的类型转换,但存在多个算术类型转换。int* ----> void* 隐式类型转换void* ---> int* 不能隐式类型转换基础数据类型之间都可以进行隐式类型转换C++四种显示类型转换1.静态类型
2021-09-16 10:56:05
802
原创 C++的引用 VS 指针
引用定义:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。语法数据类型& 变量名 = 目标对象;注意事项:1.引用必须直接初始化 形参列表引用没有直接初始化(在函数调用时初始化)**声明引用的同时必须对其初始化,否则系统会报错**2.引用一旦初始化 不能更改引用对象(不能指向其他对象) 从一而终3.对引用对象的操作,直接影响其目标对象4.&不是求地址运算符,而是起标志作用5.引用的类
2021-09-15 19:46:00
197
原创 C++函数重载
概念:C++中,在同一个作用域下面,函数名相同,参数列表不同,即构成重载重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。前提条件:在同一个作用域下面(如果作用域不同,不是重载)这里重点说明:函数名相同是指函数名一模一样,参数列表不同: 1.参数类型不同(对应位置) 2.参数个数不同 3.常属性不同 是指 指针or引用类型的常属性不一样与函数返回值类型无关C++中,在调用重载的函数时,编译阶段根据函数调用时所
2021-09-14 18:21:02
206
原创 蒙特卡罗算法
基本思想:当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。蒙特卡罗方法解题过程的三个主要步骤:(1)构造或描述概率过程对于本身就具有随机性质的问题,如粒子输运问题,主要是正确描述和模拟这个概率过 程,对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程,它的某些参量正好是所要求问题的解。即要将不具有随机性质的问题转化为随
2021-09-14 15:02:06
409
原创 C++ 中的结构体、联合和枚举浅析
结构体结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型。第二,相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。我们学过C语言中的结构体,C++中的结构体和C语言的结构体大体相同,但是C++也对C语言中
2021-09-11 10:25:20
294
原创 PAT 输出PATest
输出PATest思路1、接收字符串2、遍历字符串,使用计数数组,分别对 ‘P‘ ‘A‘ ‘T‘ ‘e‘ ‘s‘ ‘t‘ 这几个字符进行计数3、根据计数数组,按顺序分别输出‘P‘ ‘A‘ ‘T‘ ‘e‘ ‘s‘ ‘t‘ (重复循环),若计数为0则不输出,直到计数数组全为零,停止输出#include <stdio.h>#include <string.h>int main(){ int i,j; char arr[7] = "PATest"; char brr
2021-09-10 19:53:14
157
原创 PAT 字符统计
字符统计首先建个英文字母的数组,记录每个英文字母出现的次数,然后先读入一行字符串,然后遍历字符串进行判断,出现对应字母就将数组中的指定位置自增1,最后遍历整个数组输出最大频率及出现频率最高的字符。#include <stdio.h>#include <string.h>#include <ctype.h>int main(){ int i; char arr[1001] = {}; int brr[26] = {}; gets(arr); for(
2021-09-09 21:56:06
215
原创 c++ 名字空间 namespace
定义namespace 名字空间的名字{全局变量类型定义函数}意义对于一个较大型的C++程序来说,需要由多个程序员相互协作编写,这样的情况下容易出现不同程序员在需要负责的程序部分使用相同名字的变量或函数,导致程序合并后出现问题。名字空间的作用,就是将不同程序员编译的程序放入相应的名字空间,每个名字空间相对独立,空间内的变量和函数名只局限于当前空间下,从而解决命名冲突的问题。名字空间的三种使用方法(1)作用域限定符 名字空间名::标识符 表示明确访问是特定名字空间中的特定标识符 最
2021-09-07 20:58:20
546
1
原创 C++小白初入门
c++历史发展第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出
2021-09-06 18:36:19
532
1
原创 PAT 考试座位号----c语言
考试座位号使用结构体就可以简单写出#include <stdio.h>struct examinee{ long long num; int shi; int exam;}examinee[1001];int main(){ int N; int i,j; scanf("%d",&N); for(i = 0;i<N;i++) { scanf("%lld %d %d",&examinee[i].num,&examinee[i]
2021-09-05 17:04:02
367
原创 用IO多路复用之select与poll/epoll来浅谈网络聊天室
IO多路复用:IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题。select该函数用于监视文件描述符的变化情况–读写或是异常参数:nfds: 通常被设置为select所监听的所有文件描述符中的最大值+1 指定被监听的文件描述符的总数 文件描述符从0开始fd_set: 文件描述符集合 fd_set结构体仅包含一个整数数组,该数组的每个元素的每一位(bit) 标记一个文件描述符
2021-09-04 10:32:30
406
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人