1.结构体/类位域
在结构体或类中,可以根据需要设置整型成员变量的位域(short int long 或unsigned short
unsigned int 、unsigned long)就是表示类型不是采用浮点数那套表示的都可以
语法:
struct A
{
int a:2;//设置a的位域宽2bits,那么表示的范围就只能是[-2,1],多了的自动截断
}
但是,sizeo(A)==4(注意是4字节),因为会有自动补齐。
2. 231 是一个x进制的数,则一定能表示成:231 = 2*x^2 + 3*x + 1*x^0
3.平衡二叉树是每一个节点的左右子树的高度之差≤1.如果一颗树是平衡二叉树,那么这棵树的最高树高和最低树高之差≤1。
评论:判断一颗二叉树是否平衡的好方法。
4.C++在C语言上的改进(转自陈皓博客)
· 用namespace解决了很C函数重名的问题。
· 用const/inline/template代替了宏,解决了C语言中宏的各种坑。
· 用const的类型解决了很多C语言中变量值莫名改变的问题。
· 用引用代替指针,解决了C语言中指针的各种坑。这个在Java里得到彻底地体现。
· 用强类型检查和四种转型,解决了C语言中乱转型的各种坑。
· 用封装(构造,析构,拷贝构造,赋值重载)解决了C语言中各种复制一个结构体(struct)或是一个数据结构(link, hashtable, list, array等)中浅拷贝的内存问题的各种坑。
· 用封装让你可以在成员变量加入getter/setter,而不会像C一样只有文件级的封装。
· 用函数重载、函数默认参数,解决了C中扩展一个函数搞出来像func2()之类的ugly的东西。
· 用继承多态和RTTI解决了C中乱转struct指针和使用函数指针的诸多让代码ugly的问题。
· 用RAII,智能指针的方式,解决了C语言中因为出现需要释放资源的那些非常ugly的代码的问题。
· 用OO和GP解决各种C语言中用函数指针,对指针乱转型,及一大砣if-else搞出来的ugly的泛型。
· 用STL解决了C语言中算法和数据结构的N多种坑。
· 支持运算符重载和异常
5. hash_map和STL中map的区别
hash_map 是通过一个key然后利用hash函数映射求出地址下标的,取数据和数据插入时间复杂度都是O(1)(在hash冲突很少的情况下),但是空间会有一定的浪费。
STL::map是利用红黑树(二叉平衡树)来存储数据的,因此数据的插入和查找需要O(logn),但是空间利用率高且不存在hash冲突。在处理以下问题的时候STL::map会比较有优势:
1)求最大值或最小值 O(logn)
2)按序输出所有元素(中序遍历)
3)找出某个元素,当该元素不存在时找出小于该值的最大数。
hash_map的优势:
1)频繁地查找或插入数据
2)可能会频繁地删除数据(平衡二叉树的删除需要调整二叉树,hash_map的删除不能直接delete掉该内存空间,而是设置一个标记位来标记该元素已被删除)
6.死锁的条件
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待 相邻进程正占用的资源。
7.假设A是一个类,则声明A *a[3] 和 A (*a)[3]会调用构造函数吗?
解析:A *a[3] 声明的是一个指针数组,数组中有三个A *类型的元素,只有指针的声明,不存在对象的实例化。
A (*a)[3]声明的是数组指针,a指针的类型是指向的是一个有三个A对象元素的数组,但是也不存在对象实例化,没有调用构造函数。
运算符优先级:
8.一个具有n个顶点K条边的无向图是一个深林(n>k),则该深林有n-k颗树。
9.一个类的静态函数不能调用非静态函数(对象未构造时,非静态函数的入口地址未确定),但是非静态函数可以调用静态函数。
10.scanf函数的输入格式:
scanf(“%d %f”,&i,&j); 100 763.1
scanf(“i=%d ,f=%f”,&i,&j); i=100,f=763.1
也就是说,scanf函数中format的格式是什么样子的,该函数就按什么样式解析输入的串,因此输入格式就要和format的格式一样。