面经(3)

总结常见的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: 内容有些不足,会随时补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值