大根堆的定义:
1 大根堆是一个大根树
2 大根堆是一个完全二叉树
所以大根堆用数组表示是连续的,不会出现空白字段。
对于大根堆的插入
对于大根堆的插入,可以在排序前确定大根堆的形状,可以确定元素5从位置6插入,那么比较元素5和位置3的元素2,
元素5比元素2大,将2下移。接着比较元素5和元素20,一次类推,直到找到元素5的合理位置。
接着看一下如果插入的元素是21,怎么进行排序。
最近使用C++模板
,虽然工作几年了,但是模板用的很少,确切的说自己实现的机会很小。
昨天写了一个代码maxheap.h 中实现了类模板的声明,我将实现写在maxheap.cpp中,
当在main.cpp中引用maxheap中的接口时,提示链接错误。网上提供了几个解决方案,
第一种方式是将maxheap.h和maxheap.cpp包含在某个.h文件中,这样在main函数中
包含这个.h即可。第二种方式叫分离模式
,我没看,觉得没必要搞得那么复杂。第三种方式
是我最看好的方式,就是将模板类的实现也放在.h中。C++ stl模板
就是在.h中实现的。
C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域
,局部作用域
,语句作用域
,类作用域
,命名作用域
和文件作用域
。
从作用域看:
全局变量
具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
静态局部变量
具有局部作用域。它只被初始化一次,自从第一次初始化直到程序结束都一直存在,即它的生命周期是程序运行就存在,程序结束就结束,
他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。也就是在别的函数访问这个变量是错误的。
局部变量
也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。
生命周期在函数结束后就结束了,作用域也仅限于该函数。
静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。
这样即使两个不同的源文件都定义了相同的静态全局变量
,他们也是不同的变量。
TCP
(transport control protocol,传输控制协议
)是面向连接
的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,
因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法
),将多次间隔较小且数据量小的数据,合并成一个大的数据块
,
然后进行封包
。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。即面向流的通信是无消息保护边界的。
UDP
(user datagram protocol,用户数据报协议)是无连接的
,面向消息
的,提供高效率服务。不会使用块的合并优化算法,
由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)
采用了链式结构来记录每一个到达的UDP包,
在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。 即面向消息的通信是有消息保护边界的
。
C++单例模式主要用途就是整个程序中只实例化一个对象,之后获取到的都是该对象本身进行处理问题。
单例模式
一般都是在函数中采用局部静态变量完成的,因为局部的静态变量
生命周期是随着程序的生命周期
一起结束,所以不用担心会失效。另外局部的静态变量作用域
仅限于该函数内部,别的函数不会直接使用。
第三点就是局部的静态变量跟所有的静态变量一样,放在全局区(静态区)
,只被初始化一次
。
类的引用成员
,类的常量成员
,类的static成员
的初始化方式类的引用成员和常量成员初始化放在初始化列表里,因为初始化只有一次,需要在构造函数之前进行初始化,写在类的构造函数会出错。类的static变量要放在类声明的外边定义,因为static变量属于整个类,而不是类对象,所以不能放在类的构造函数里。
举个例子:
一个类中既有常量成员也有引用成员
1 | class MyClass |
创建互斥锁的方法是调用函数CreateMutex
1 | HANDLE CreateMutex( |
第一个参数是一个指向SECURITY_ATTRIBUTES
结构体的指针,一般的情况下,可以是nullptr。
第二个参数类型为BOOL,表示互斥锁创建出来后是否被当前线程持有
。
第三个参数类型为字符串(const TCHAR*),是这个互斥锁的名字
,如果是nullptr,则互斥锁是匿名的。
例子:
HANDLE hMutex = CreateMutex(nullptr, FALSE, nullptr);
semophore
是信号量的意思,常用于PV操作
,所谓PV操作就是pend(等待,直到有资源可用,并且消耗资源)V就是释放资源。semophore和mutex区别
,mutex
本意为互斥,用于线程独占资源,常用于临界区访问锁住mutex,当线程A对mutex加锁后,其他线程不能反问临界资源,也不能加锁,直到线程A解锁,其他线程才能访问。而semophore则可以在不同的线程之间进行pv操作,semophore可以设置最多有多少个信号量
,以及初始的信号量,当调用V操作
的时候信号量数量增加一个,调用P操作
时候信号量数量减少一个,但是不能超过最多的信号量。信号量是一个非负数。