遇到新的知识时,经常是看一眼就过去了,没有记录下来、温故而知新,所以决定在这里做一个笔记,可以经常回来看看。
短时间内快速掌握一门新知识、技术的能力
算法
分治的本质:拆分成最小的部分进行操作
二分查找的函数: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