
语法学习
黑发要知勤学早
懒得连简历都不写
展开
-
kmp字符串
题目描述:和单调栈和单调队列一样,先想出暴力的做法,之后再优化char s[N], p[M]; //s的长度大于pfor(int i = 1; i <= n; i++){ bool flag = true; for(int j = 1; j <= m; j++) { if(s[i + j - 1] != p[j]){ flag = flase; break; } }}如图所示,蓝色的线表示的是长的字符串, 红的是表示的模板字符串。可以看到,在遍历到原创 2021-04-22 11:37:30 · 126 阅读 · 1 评论 -
const在不同的位置
常见的使用const修饰变量的场景如下:1. const int *a = &b;2. int const *a = &b;3. int * const a = &b;4. const int * const a = &b;对于1和2来说,对于const在*左边,表示的是a指向的内容是不能改变的,但是指针是可以改变的对于3来说,const在*右边,表示的a的指针是不能变的,但是指针的内容是可以变的对于4来说,指针指向的地址不能变,并且地址里面装的东西也不能够变原创 2021-09-03 22:02:59 · 1200 阅读 · 0 评论 -
使用sizeof的时候需要注意
如果是一个数组指针,可以通过 sizeof 指针名来计算指针里装的元素的大小,但是当你使用这个指针做为参数传递到函数中,数组大小的信息丢失,只能计算指针的大小。例如#include<iostream>#include<string>using namespace std;= {"afafs", "fadfsaf", "fadfsaf", "fadfsaf"};int main(){ change(name); cout << sizeo原创 2021-08-21 20:19:07 · 107 阅读 · 0 评论 -
C++面试STL
https://www.cnblogs.com/xiaokang01/p/12460786.html原创 2021-08-13 14:40:41 · 131 阅读 · 0 评论 -
C++中的特化和偏特化
在写STL的过程中,编写萃取(trait)的时候,有使用到偏特化概念;使用template的时候,一般是根据各种类的关系的共性,编写一个一般化的类,里面的属性都是使用的模板。但是在使用的时候,可能某一些情况下,这个一般化的条件可能不满足,就需要进行特化,也就是特殊处理一些不能够一般化处理的条件#include <iostream>using namespace std;template <class T>class TClass{public: bool原创 2021-08-12 12:16:49 · 325 阅读 · 0 评论 -
C++ primer学习记录
基本变量类型注意,这里的大小表示的最小尺寸,不是常见的大小。现在int一般是4个字节,32位,short int 是16位, long double 是16字节 128位。 long 和 long long都是8个字节float的精确到小数点后6-7位,double是到后15-16位对于空指针是8cout << sizeof(void *) << endl;82.指针和引用的区别添加链接描述#include<iostream>#include&.原创 2021-07-25 17:32:14 · 100 阅读 · 0 评论 -
C++中volatile有什么作用
在编译器中存在很多优化,有时候可能不能将一个变量的变化读取到,加上volatile,每次的值,都要通过实际变量去取得,不会直接读取寄存器的值。因为为了优化,寄存器可能先就读取了变量的值,然后在需要的时候直接到寄存器去读取,这中途可能变量的值已经改变了。这个关键字主要是用来修饰多线程访问和修改的变量,每次用到被volatile修饰的变量,都要直接从对应的内存中去读取数据,而不去读取随时可能变化的值。...原创 2021-07-19 09:07:46 · 297 阅读 · 0 评论 -
static变量在类中是声明而不是定义
添加链接描述原创 2021-07-19 08:42:39 · 279 阅读 · 1 评论 -
引用和常量引用的区别
引用是给变量起的一个别名,只有初始化后的变量才可以引用。引用后,对引用变量的更改会改变源变量数据。使用常量引用不能改变源变量数据,否则编译错误。#include<iostream>using namespace std;int n, q, k;int a[100100];int main(){ int a = 10; //引用就是给变量起一个别名,并且对别名的更改会造成变量的更改 //引用必须初始化,并且 //注意,这里的&是取别名,不是原创 2021-07-13 10:43:45 · 924 阅读 · 0 评论 -
C++如何设计一个不能继承的类?
问题:首先如果一个类不能够继承,那他的构造函数和析构函数一定是私有的,因此,这两个函数一定不能够继承,那么这个类就无法构造了。但是我们可以通过其他的方式来进行构造。比如静态函数的方式。我们返回一个类的实例对象。...原创 2021-06-08 08:24:11 · 104 阅读 · 0 评论 -
构造函数初始化列表和构造函数内赋值
参考自大佬详情对于内置数据类型,构造函数初始化列表和构造函数内赋值是基本一样的。但是对于结构体类型和自定义类类型,初始化列表更好。当使用初始化列表构造对象的时候,初始化一次就完成了;如果使用构造函数内赋值,要调用两次构造函数,第一次使用默认值初始化,第二次调用使用赋值语句进行赋值。效率上初始化列表更好,特别是当定义的变量多的时候,即内存使用量大的时候。当你的成员是常量或者是引用的时候,即变量只能初始化,不能赋值。这个时候只能用初始化列表。使用括号来进行初始化时,只能在定义的时候。...原创 2021-06-07 18:08:56 · 254 阅读 · 0 评论 -
C++的虚函数相关的面试题目总结
1.什么是虚函数?在类的定义中,以virtual开头函数就是虚函数。它的出现1是为了便于继承的时候可以直接重写该函数,实现多态;2是为了实现动态的编译绑定,具体实现什么功能要根据基类指针指向的对象来进行动态绑定。如果有多个子类继承自一个基类,那么我们只要继承这个基类再重写虚函数即可完成多态。注意:1.必须在类声明中才可以定义虚函数,并且虚函数可以不实现。2.如果已经存在虚函数了,不能再定义一个传入参数,返回参数等等都和虚函数一样的非虚函数。3.如果有派生类,析构函数一定要定义为虚函数,因为在构造对原创 2021-05-31 00:21:22 · 884 阅读 · 0 评论 -
unordered_map中find和count函数的区别
count函数直接放回的是一个数值,如果存在,那么返回1,反之0;find返回的是一个iterator, 直接输出iterator是会报错的,要输出的话得取出迭代器的值再输出。详情看代码#include<iostream>#include<unordered_map>using namespace std;unordered_map<int, int> hashmap;int main(){ hashmap[1] = 9; has原创 2021-04-27 10:11:51 · 5255 阅读 · 0 评论 -
const修饰
1.用在变量定义上,说明这个变量是常量值,不可变。2. 函数中给形参使用,表示调用过程中,这个变量是不可变的#include<iostream>using namespace std;int getnum(const int &i){ int res = i; i = 55;//去掉这句可正常运行 return res;}int main(){ int a = 15; int b = getnum(a); cout <原创 2021-04-02 10:59:58 · 107 阅读 · 0 评论 -
static变量有什么作用?
static变量是静态全局变量,只初始化一次,如果是类中的static变量,那么在类外都可以实现调用。static声明的变量是本文件内的全局变量,可以被本文件内其他的函数调用,static函数也是一样。对于static变量,它存储在全局数据区,定义的时候就要分配内存。它是类的成员,不是对象的成员,因此无论对象有多少个,static变量都只有一个。static函数是类成员,不是对象成员,调用的时候使用类调用...原创 2021-04-02 10:16:58 · 1205 阅读 · 0 评论 -
ASCII,Unicode和utf-8的联系与区别
参考文章:https://www.cnblogs.com/tsingke/p/10853936.html原创 2021-03-25 14:28:44 · 119 阅读 · 0 评论 -
Python在使用可变数组用下标出错
在Python中使用可变数组s = []如果直接使用下标进行操作会出错,如下after=[]for i in range(0, 1023): #after.append(0) for j in range(1, len(imfs) - ab): after[i] += imfs[j - 1][i]这个时候由于 数组还是空的,操作就会下标越界要先使用append添加数组再操作下标。...原创 2021-03-24 08:12:08 · 296 阅读 · 0 评论 -
使用C++读写文件
可以使用头文件<fstream> //这个头文件既可以读文件,也可以写文件可以使用cin和cout,// effectiveC++.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <fstream>using namespace std;int main(){ string s; //cout << sizeof(s) << e原创 2021-03-23 16:22:36 · 146 阅读 · 0 评论 -
二进制文件和文本文件的存储大小的区别及计算方式
二进制文件和文本文件的存储过程是不一样的。一般来说,二进制文件要小于文本文件的。1.二进制文件存储:二进制文件存储不用符号什么的隔开,直接数与数紧挨在一起。比如10, 12的存储需要4个字节。存10的时候,二进制编码是0Ah, 00h, 后面的是空白符,前面的是表示10的二进制数。如果存储的是大于255的数,那么低8位在前,高八位在后。如果整型的数超过了16位能表示的数了,那么就会使用4个字节32位来表示这个数,再大的数就用64位8个字节了。二进制文件的实型数据也有字节长度的区分,比如 4 字原创 2021-03-23 15:30:43 · 6126 阅读 · 0 评论 -
为什么基类的析构函数必须是虚函数?
https://blog.youkuaiyun.com/h_wlyfw/article/details/19039823简单来说就是由于有继承关系,如果基类指针指向子类,调用的析构函数如果不支持多态就 无法调用子类的析构函数。造成内存泄漏。原创 2021-03-22 09:45:49 · 324 阅读 · 0 评论 -
C++多态的实现
多态的实现方式有两种,1是通过指针实现, 2是通过引用实现,但是引用不像指针那么灵活。#include <iostream>using namespace std;//基类Peopleclass People{public: People(char *name, int age); virtual void display(); //声明为虚函数,虚函数的存在是实现多态的基础protected: char *m_name; int m_age;}转载 2021-03-21 21:06:22 · 1045 阅读 · 0 评论 -
C++面试题目总结
1.C++和c的区别C++的功能相对于C更加完善,C是面向过程,C++添加了面向对象特性。C++有了多态,继承,封装等等特性。2.delete和delete[]有什么区别前者只调用一次析构函数,即释放一个对象的内存,后者对每一个对象都调用内存,多次析构;C++中既可以调用malloc/free库函数,也可以使用new/delete运算符;可是对于非int, double等内置类型,使用前者不能满足动态调用的条件;MemTest *mTest1=new MemTest[10];MemTest *mT原创 2021-03-18 21:38:22 · 108 阅读 · 0 评论 -
枚举类型enum的使用
使用enum就像使用了函数的类型定义,使用它时,只能创建enum类型中的一个// effectiveC++.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>using namespace std;enum MyEnum{ lover = 100, wife = 142 };MyEnum x = lover;MyEnum get_num(MyEnum* a) { MyEnum x = *a; //由原创 2021-03-17 20:16:35 · 301 阅读 · 0 评论 -
more effective C ++ 35个改善程序的有效方法
pointer和reference的区别reference必须是要指向一个对象的,它不能指向null,并且reference是不能改变的,相当于门牌号是不变的,但是内容可以变。取地址用的是&案例如下:#include<iostream>using namespace std;void change(string &s){ string str = "123333333"; cout << &s << ' '<.原创 2021-03-13 19:30:27 · 161 阅读 · 0 评论 -
namespace
C++中的命名空间:为了减少合并程序时变量和函数的过定义参考文档点击这里定义格式:namespace myspace{ //int a,b; .....可以定义各种各样的函数,变量}使用的时候using namespace myspace;int c = a; //直接可以使用myspace中定义的变量//多个空间可以定义相同的变量也不会发生冲突多个空间可以定义相同的变量也不会发生冲突#include <iostream>using namespace std原创 2021-03-11 16:38:06 · 80 阅读 · 0 评论 -
函数形参如果定义为引用
#include<iostream>#include<cstring>using namespace std;void f(int &a){ a = 13; printf("fa = %d &fa = %d\n", a, &a);}int main(){ int x = 0; printf("x = %d &x = %d\n", x, &x); f(x); int xx = 1;原创 2021-03-06 09:44:44 · 613 阅读 · 0 评论 -
浅拷贝和深拷贝
浅拷贝:只复制了源对象地址,如果改变值,会直接影响到源对象深拷贝:直接复制了一份源对象,对当前对象的改变不会影响到源对象。原创 2021-03-04 21:34:31 · 81 阅读 · 1 评论 -
throw
关于C++的异常处理机制如果本层处理了抛出异常,那么本层之后的代码也会执行,如果本层没有catch处理代码,直接抛出到上一层函数去处理,一直到被处理了为止。#include <iostream>#include <string>using namespace std;class CException{public: string msg; CException(string s) : msg(s) {}};double Devide(double x原创 2021-03-02 08:41:12 · 138 阅读 · 0 评论 -
#ifndef
预编译命令#ifndef MYTINYSTL_VECTOR_H_ //解释:如果没有定义**,定义**这样可以防止重复定义。#define MYTINYSTL_VECTOR_H_//程序段1#endif //一直到endif才会执行完如果你的ifdef 后面是多个条件的话,需要写成下面的格式#if (defined A) && (defined B)//...#endif这里是引用参考链接...原创 2021-03-01 23:49:54 · 152 阅读 · 0 评论 -
如何计算结构体的大小
在字节跳动面试的过程中遇到的题目,查找了计算的过程,现在整理如下:第一项1.针对操作系统有不一样, 32位是4个字节, 64是8个字节2.结构体中,单个元素的最大值3. 1,2,4,8,16,32 2的整数次方前三点取最小值,即是实际对齐单位,结构体最终的大小必须是最小值的整数倍第二项1.针对每一个元素求偏移起始地址,任意一个元素起始地址必须是当前元素大小和第一项中最小值之间取得的最小值的倍数(取较小值)根据以上规则我们来计算一下下面的例子:#include<iostream&原创 2021-03-01 17:35:07 · 121 阅读 · 2 评论 -
.和->的区别
取决你访问的类型,如果是指针,用后者,变量或者函数用前者原创 2021-02-06 14:25:45 · 1972 阅读 · 2 评论 -
结构体和类的区别
几乎一样,但是结构体内的变量和方法默认为public,类里为private类和结构体内的构造函数:如果不写,自动构造一个无参数的构造函数struct Person{ private int age, height; Person(){ age = 25, height = 174; }}定义一个Person的时候Person p;如果有好几种构造方法,就要多写几个构造函数还有一种写法,就是直接就赋值,代码效率稍高一些,编译时有优化注意类的构造方法是public,要声明.原创 2021-02-06 14:24:32 · 102 阅读 · 0 评论 -
C ++中public、private
类中public、private的区别与联系1.public定义的变量和常数都可以被其他类型变量(该类的孩子,兄弟等,其他类)使用, 类似公共用品。以public继承基类,基类的所有的属性和方法都保持原样不变。2.private只能在类里面调用,但是private修饰的变量也不是不能被其他类改变,可以通过该类中的public方法调用private变量private继承基类,所有的方法和变量都变为private,类似于集合的关系...原创 2021-02-06 14:05:56 · 2860 阅读 · 1 评论 -
最长公共子序列
题目:f[i - 1, j]表示的是A[1~i -1]和B[1~j - 1]的公共子序列的集合,但是【0,1】状态表示的是包含b[i]但是不包含a[i]的集合,所以其实f[i-1,j-1]包含了[0, 1]状态。但是由上图的分析看到,所要求的属性是最大值,集合重复覆盖也不影响,但是如果要求的是和就必须考虑不重不漏。#include<iostream>#include<algorithm>using namespace std;const int N = 1010;原创 2020-08-21 11:10:18 · 102 阅读 · 0 评论 -
在c语言函数调用中用指针操作数组
直接上代码#include<iostream>using namespace std;int p[20];void change(int *p){ for(int i = 1; i <= 8; i++) p[i] = 1;}int main(){ change(p); for(int i = 0; i < 20; i ++) cout << p[i] << ' '; return 0;}输出为0 1原创 2020-08-18 17:23:07 · 2010 阅读 · 0 评论