map的实现原理:
map和list有相通的一些特性,map底层是使用了RB_Tree来实现的,所以map是一种自动排序的数据结构,,由于map所开放的各种操作接口都是由转RB_Tree操作行为而已。。
红黑树:
红黑树的特性
1. 每个节点要么红要么黑
2. 根节点为黑色
3. 叶子结点为黑色
4. 红结点的俩个子节点为黑色
5. 当前结点到叶子结点的任意一条路上所经过的黑结点的个数的相同的。
红黑树的各种操作的时间复杂度为0(logn)
红黑树相比其他的数据结构。
1. 相比二叉查找树:bst树在一些操作后可能让树的结构成为一个线性,导致树的查找效率降到很低,无法利用树的特性。使用了红黑色RB_TREE可以使树状结构保持,同时最长路径不大于俩倍的最短路径,使最坏的查找也能使其在0(logN)找到。而如果是线性的bst树要使用0(N)
2. 相比avl树,平衡树,其平衡程度没有avl树高,但是因为avl树的插入,删除所花费的时间要比红黑树高很多,代价太大,红黑树在插入删除节点都能够在三次旋转中解决。
3. 哈希表,面对海量数据和内存受限时hash将花费更多的时间去构造,同时处理冲突的问题。所以哈希表的查找速率很高,适用于静态的数据中,而红黑树在构建和插入删除上的优势可以让其能够更好的处理动态数据。
如使用rb_tree处理 防火墙。
Map使用红黑树的原因是:
红黑树为一种平衡树,利用其自动排序功能。和插入删除搜索的方便性
常见面试问题:
1. 进程的有哪几种状态,状态转换图,及导致转换的事件。
2. 进程与线程的区别。
3. 进程同步的几种方式。
4. 线程同步几种方式。
5. 线程的实现方式.。
6. 用户态和核心态的区别。
7. 用户栈和内核栈的区别。
8. 内存池、进程池、线程池。
9. 死锁的概念,导致死锁的原因.
10. 导致死锁的四个必要条件。
11. 处理死锁的四个方式。
12. 预防死锁的方法、避免死锁的方法。
13. 进程调度算法。
14. Windows内存管理的方式(块式、页式、段式、段页式).
15. 内存连续分配方式采用的几种算法及各自优劣。
16. 动态链接及静态链接.
17. 基本分页、请求分页储存管理方式。
18. 基本分段、请求分段储存管理方式。
19. 分段分页方式的比较各自优缺点。
20. 几种页面置换算法,会算所需换页数。
21. 虚拟内存的定义及实现方式。
22. 操作系统的四个特性。
C++的空类中默认的成员函数
对于一个空类,编译器默认产生4个成员函数:
默认构造函数,析构函数,拷贝构造函数,赋值函数
结构体中是否有构造函数,析构函数,成员函数。如果有结构体和类有什么区别。
Struct和class的区别:
Struct默认的权限为public,class默认的权限是private
Struct继承的权限默认为public class为private;
Struct用来申明一个数据类型,class用来申明一个对象。
4种智能转化:
Static_cast:
1.用于类层次结构的转换
这种智能转换上行转换是安全的,下行转换时是不能保证安全性的。
2.用于基本数据间的转换,
3.把空指针转换成目标类型的空指针
4.把任何数据类型转换成void
Reinpreter_cast
必须是指针,引用,可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。(当从指针到整数再回到指针时所指向的值不变)
Const_cast:
可以修改const volatile类型修饰的变量的属性
Dynamic_cast
其他三个都是编译时转换,其实运行时转换
1. 上行转换时安全的
2. 多重上行转换是安全的
下行的智能转换:
转换成void*类型,必须包含虚函数,就说明她想让基类指针指向派生类的对象,运行时检测运行时类型信息,这个信息存在内的虚函数表中。
在下行转换时,检测原始类型是否真正指向一个目标类型如果是则转换,否则返回NULL,保证了其智能性和安全性。
指针和引用的区别:
1. 引用的非空性,任何情况下,都不能使用指向空值的引用
2. 引用必须在声明时初始化,指针在声明时可以先不初始化
3. 使用引用不需要测试他的合法性,指针总是要测试他的合法性
4. 引用从一而终,
5. 引用可以被当作左值使用
C++中的智能指针:
6. shared_ptr,基于引用计数的智能指针。可随意赋值,直到内存的引用计数为0的时候这个内存会被释放。
循环引用:
Weak_ptr 弱引用解决循环引用问题;
循环引用为俩个智能指针成环互相指向,其要求都是计数为0时被释放,则都在等待对方先被释放。
Explicit:
c+中的关键字,防止隐士转换
Memcpy和strcpy的区别:
Strcpy是用来复制字符串使用已\0结束
Memcpy是按照字节copy有指定长度,适合各种类型的复制。
Union的存储
Union的存储问题
Union{
Chara[4];
Int b;
}
a[0] = 1;
a[1] = 2;
a[3] = 3;
a[4] = 4;
b = 0x0005;
则a中的值被变为了什么
因为一般的操作系统都为小端字节序
低地址 高地址
栈中的分配:a[ 0, 1, 2, 3 ]
Int b: 0x5 0x0 0x0 0x0
这样的存储方式导致,a[0]的值被变成了0x5 。。。。。
虚继承是为了解决钻石问题。
排序 时间复杂度
插入排序 O(n2)
冒泡排序
选择排序
希尔排序
快速排序 nO(logn)
堆排序
归并排序
基数排序 O()d(n+r)
其中稳定的排序:
冒泡,插入,归并,基数