我的学习笔记

遇到新的知识时,经常是看一眼就过去了,没有记录下来、温故而知新,所以决定在这里做一个笔记,可以经常回来看看。

短时间内快速掌握一门新知识、技术的能力

算法

分治的本质:拆分成最小的部分进行操作

二分查找的函数:lower_bound upper_bound binary_serach

n分解为整数,要使乘积最大,n应该拆分为2和3

当需要保持初始的排序意义时,稳定的排序算法才有意义(初始的排序是有意义的,在这个有意义的排序的基础上,在做一次排序。如学生按学号排好序了,现在要让学生按年龄从小到大再排个序,年龄相同的,按学号排序。用稳定的排序算法只需要一次就好了;而不稳定的排序算法排完之后,同年龄的还要按学号再排一次)

堆:由完全二叉树实现
堆排序:将最大堆对顶的数取出,剩余的堆继续调整为最大堆。
大顶堆:每个节点的值都大于或等于其左右孩子节点的值
小顶堆:每个节点的值都小于或等于其左右孩子节点的值

中缀转后缀:
1.遇到操作数,直接输出
2.遇到操作符,弹出栈中操作符,直到遇到优先级更低的操作符或栈空,将操作符压入栈中
3.遇到右括号,输出栈中操作符,知道遇见左括号
4.读到输入末尾,将栈中所有元素依次弹出

后缀表达式的计算:从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后栈顶的值即为表达式的结果

并查集的重要思想在于:用集合中的一个元素代表集合

图:点和边的集合。点集为空集的图称为空图。
平凡图:仅有一个节点的图
度:与顶点连接的边的数目

超图:一条边可以连接任意数量的顶点。
超边表示任意数量顶点的集合
k-均匀超图:超图的每个边连接的顶点个数相同,都为k
含有超边的无向图就是超图

归并排序:对排好序的数组进行合并,要用到一个临时数组

网络

TCP是一种面向连接的单播协议,传输控制协议,提供面向链接的可靠字节流服务。
UDP:用户数据协议,面向数据的运输协议,面向非链接协议。

三次握手建立一个连接,四次挥手关闭一个连接
三次握手的内容是:
第一次:syn=1,seq=x(发送端的序列号)表示我想和你建立连接,我的序列号是x
第二次:接收端发送ack=1,acknum=x+1,表示我收到了你的信息,你确认一下序列号是不是这个:x;发送syn=1,seq=y,表示我想和你建立连接,我的序列号是y
第三次:发送端回复:ack=1,acknum=y+1,表示我收到了你要建立连接的信息,序列号是:y
四次挥手的内容是:
第一次:发送端发送 fin=1,seq=x,表示我想和你断开连接
第二次:接收端发送 ack=1,acknum=x+1,表示好的,我收到的你的消息
第三次:接收端发送fin=1,seq=y,表示我也想和你断开连接
第四次:发送端发送ack=1,acknum=y+1,表示好的,我知道你要断开连接了

c++

常对象只能调用常成员函数

static 修饰普通函数,表明函数的作用范围尽在定义改函数的文件内才能使用

this:隐含于每一个非静态成员函数,指向调用该成员函数的对象

inline函数改变需要重新编译,是否内联由编译器决定
虚函数可以是内联函数,但是当虚函数表现多态性的时候不能内联(内联是发生在编译期间,编译器会自主选择内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。inline virtual 唯一可以内联的时候是:编译器知道所调用的对象是哪个类,这只有在编译器具有实际对象而不是对象的指针或引用时才会发生。)

volatile 声明的变量每次访问都必须从内存中取值

volatile int i=10;
int a=i;
....
//其它代码,并未明确告诉编译器,对i进行过操作
int b=i;
/*volatile 指出i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,
因而编译器生成的汇编代码会重新从i的地址读取数据放在b中,而优化做法是,
由于编译器发现两次从i读取数据的代码之间的代码没有对i进行操作,
它会自动把上一次读取的数据放到b中,而不是重新去i的内存里再读一遍。
这样一来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,
所以说volatile可以保证对特殊地址的稳定访问。
*/

私有成员:类内可访问,类外不可访问
保护成员:类内可访问,子类可访问,其它的不能访问

浅拷贝:只复制指向某个对象的指针,对于基本数据类型,浅拷贝也是直接复制值
深拷贝:构造一个一摸一样的对象

公有继承:表示 is-a
私有继承:表示has-a

继承一个类,还是把这个类的对象作为成员变量,看具体的需求。

负数的补码:符号位不变,其它位按位取反,最后加1

!非 和 ~按位取反是不一样的

int (*pFun)(int) 函数指针,函数的返回类型为int ,形参为int ,指针名为pFun

A*B可以用加法和位运算模拟:

noexcept关键字:告诉编译器,函数中不会发生异常,有利于编译器对程序做更多的优化

构造函数前加explicit关键字:表示该构造函数只能被显示调用。(只对一个参数的构造函数有用,因为多个参数的构造函数不允许发生隐式转换)

while(B){
	if(B&1){
		ans+=A;
	}
	A<<=1;
	B>>=1;
}

操作系统

进程:是程序的一次执行过程,程序分配和管理资源的基本单位,每个进程都有自己的地址空间

线程:是cpu调度和分派的基本单位,可以和同一进程下的其他线程共享全部资源。线程是进程的一部分,一个进程可以有多个线程,但线程只存在于一个进程中。线程有:初始态、执行态、等待态、就绪态、终止态

进程间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程一把数据从用户空间拷到内核缓冲区,进程二再从内核缓冲区把数据读走

Qt

永远不要随便构建别人的代码,因为你不知道它有多大
QApplication::processEvents() 让程序处理那些还没有处理的事件,然后再把使用权返回给调用者

QThread 只有run函数是再新线程里的,其它所有函数都再QThred生成的线程里(槽函数在哪个线程执行要看连接方式,大部分都还是在主线程执行)
moveToThread 适合单次执行,不适用高频率任务
QThread中slot和run函数共同操作的对象,都会用QMutex锁住。

greaterThan(QT_MAJOR_VERSION;4):QT += widgets。表示:如果QT主版本大于4,则需要添加widgets模块。也可以直接用“QT += widgets",这样是为了保持与QT4的兼容性

软件工程

向进度落后的项目中增加人手,只会使进度更加落后

缺乏合理的时间进度是造成项目滞后的最主要原因

系统的概念完整性决定了使用的容易程度

保证问题处理原则上的一致性

数据的表现形式是编程的根本

缺陷修复总会以(20%-50%)的几率引入新的bug

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值