C++ STL 里map 和 hash_map的异同
答:
C++ 11标准之中,定义了unordered_map,就是一种hash_map 。
相同点:
1. 二者的用法相同,有insert,size,count等操作。所有元素是以pair类型存储。
不同点:
1. 底层实现不同。map是基于rb_tree, hash_map是基于哈希表。
2. hash_map的速度更快,查找速度为O(1)。map的查找速度是O(log(n))。插入数据的速度同样,hash_map的速度会快很多。
3. hash_map相比于map会消耗更多的存储空间,所以需要控制内存空间的时候需慎重使用hash_map。
list 和 vector 的区别
1. vector为对象分配连续的空间,所以随机访问的效率很高。适合存储小容量内容。大容量数据的话,vector的开销成本太大。
2. list 是离散存储的,在首尾插入元素,效率很高。
适用对象:
vector:对象数量变化少,随机访问元素频繁。
list: 对象数量变化大,对象复杂,插入和删除频繁。
C++ 占用的内存有哪些部分
1. 栈: 编译器自动分配和释放。存放局部变量值等等。
2. 堆: 程序员分配和释放,或者程序结束时候OS回收。
3. 全局区(静态区):这二者在一起。程序结束之后释放。
4. 文字常量区:常量字符串存放的地方。
5. 程序代码区:存放程序代码。
介绍下C++智能指针
它是存储指向动态分配对象指针的类,用于生存期控制,能够自动正确的销毁动态分配的对象,防止内存泄露。他使用的方法是引用计数。每次创建智能指针类的对象时,计数置为1。对该对象赋值时,赋值操作符做操作时所指向的对象减掉1。右操作符指向对象计数+1。如果引用计数减为0,删除基础对象。
C++的多态
多态就是讲子类类型的指针赋值给父类类型的指针。
虚函数
虚函数通过一张虚函数表实现。当我们用父类指针操作子类时,用这张表来查找实际应该调用哪一个函数。
指针和引用的区别
引用不能为空,指针可为空,不过最好不要为空。
引用定义时必须初始化,指针不必。
引用不改变指向,指针会。
引用更安全。
动态绑定和静态绑定的区别
静态绑定:对象是静态类型。出虚函数之外全都是静态绑定。
动态绑定:对象是动态的类型。发生在运行期。只有虚函数可以使用。