总结常见的STL库以及Boost库。现在很多面试一开口就要问你关于STl和Boost熟不熟悉。还有关于c++11新特性。
1.常见STL库
STL库基本概念:组件、容器、迭代器、算法
容器:map、vector、set、list、deque、stack
算法:搜索、排序、拷贝、数值运算
迭代器:iterator 读/写遍历元素 const_iterator 只读模式遍历元素
容器:
顺序性容器:vector、deque、list
关联性容器:set、multiset、map、multimap
容器适配器:stack、queue
(1)map:
1)map是怎么实现的?查找的复杂度是多少?能不能边遍历边插入?
红黑树和散列 O(logn)
不可以,map不像vector,它在对容器执行erase操作后不会返回后一个元素的迭代器,所以不能遍历地往后删除
2)为何map和set不能像vector一样有个reserve函数来预分配数据?
map和set内部存储的已经不是元素本身了,而是包含元素的节点。也就是说map内部使用的Alloc并不是map声明的时候从参数中传入的Alloc。
3)map和set的插入和搜索速度变化如何当数据元素增多时(10000和20000个比较)
map和set的底层都是红黑树,红黑树的搜索近似于二分查找,二分查找呢,平均时间复杂度是log2n
4)hash_map和map的区别在哪里
hash_map底层是散列的所以理论上操作的平均复杂度是常数时间,map底层是红黑树,理论上平均复杂度是O(logn)
5)写多读少应该用什么容器?
私以为是链表,链表的插入操作时常数时间复杂度,访问操作是O(n),是最适合写多读少的容器。
(2)vector:
1)vector内存用完了,会以当前size大小重新申请2*size的内存,然后把原来的元素复制过去,把新元素插上,然后释放原来的内存。
一般我们释放vector里的元素使用clear,其实它不能释放内存,要想释放内存要使用swap。
可以读和写,但是必须自己去写多线程安全措施
2)vector每次insert或erase之后,以前保存的iterator会不会失效?
理论上会失效,理论上每次insert或者erase之后,所有的迭代器就重新计算的,所以都可以看作会失效
(3)set:
头文件#include <set>
set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。
实质上相当于是平衡检索二叉树
(4)list:
list(列表)
list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点
(5)deque(队列):
#include<deque>
连续存储结构,即其每个元素在内存上也是连续的,类似于vector,不同之处在于,deque提供了两级数组结构, 第一级完全类似于vector,代表实际容器;另一级维护容器的首位地址。这样,deque除了具有vector的所有功能外,还支持高效的首/尾端插入/删除操作。
参考博客讲的很详细: http://www.cnblogs.com/xkfz007/articles/2534249.html
http://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html
2.Boost库
(1)智能指针
boost.smart_ptr
scoped_ptr、
scoped_array、 shared_ptr、 shared_array、 weak_ptr和intrusive_ptr
(2)date_time库概述
(3)处理日期
3.C++11新特性
(1)lambda
lambda是匿名函数,可以拿来当作inline函数使用
用于创建并定义匿名的函数对象,以简化编程工作。
(2)auto
auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导
(3)decltype
decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型
(4)nullptr
nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0
(5)序列for循环
C++中for循环可以使用类似java的简化的for循环,可以用于遍历数组,容器,string以及由begin和end函数定义的序列(即有Iterator)
举例:
map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
for (auto p : m){cout<<p.first<<" : "<<p.second<<endl;
}
(6)智能指针内存管理
std::shared_ptr
std::weak_ptr
PS: 内容有些不足,会随时补充