C++面试100问(十)
C++中unordered_map和map的区别是什么?
map是STL中的一个关联容器,提供键值对的数据管理。底层通过红黑树来实现,实际上是二叉排序树和非严格意义上的二叉平衡树。所以在map内部所有的数据都是有序的,且map的查询、插入、删除操作的时间复杂度都是O(logN)。unordered_map和map类似,都是存储key-value对,可以通过key快速索引到value,不同的是unordered_map不会根据key进行排序。unordered_map底层是一个防冗余的哈希表,存储时根据key的hash值判断元素是否相同,即unoredered_map内部是无序的。
C++中vector是如何扩容?
vector的动态增加大小的时候,并不是在原有的空间上持续新的空间(无法保证原空间的后面还有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,并释放原空间。在VS下是1.5倍扩容,在GCC下是2倍扩容。
C++中vector容器是什么?
vector就是一个动态增长的数组,里面有一个指针指向一片连续的空间,当空间装不下的时候,会申请一片更大的空间,将原来的数据拷贝过去,并释放原来的旧空间。当删除的时候空间并不会被释放,只是清空了里面的数据。对比array是静态空间一旦配置了就不能改变大小。
C++中文件编译与执行需要经历哪四个阶段?
1)预处理:根据文件中的预处理指令来修改源文件的内容 2)编译:编译成汇编代码 3)汇编:把汇编代码翻译成目标机器指令 4)链接:链接目标代码生成可执行程序。
C++中定义和声明的区别是什么?
声明是告诉编译器变量的类型和名字,不会为变量分配空间,定义需要分配空间,同一个变量可以被声明多次,但是只能被定义一次。
C++中如何防止内存泄漏和指针越界?
malloc/free要配套,对指针赋值的时候应该注意被赋值的指针是否需要释放;使用的时候记得指针的长度,防止越界。
C++中什么是内存泄漏?
动态分配内存所开辟的空间,在使用完毕后未手动释放,导致一直占据该内存,即为内存泄漏。
C++中#include<file.h> #include "file.h" 的区别是什么?
前者是从标准库路径寻找,后者是从当前工作路径。