- 当数据元素增多时(从10000到20000),map的set的查找速度会怎样变化?
- RB-TREE用二分查找法,时间复杂度为logn,所以从10000增到20000时,查找次数从log10000=14次到log20000=15次,多了1次而已 。
- map 、set、multiset、multimap的特点
- set和multiset会根据特定的排序准则自动将元素排序,set中元素不允许重复,multiset可以重复 。
- map和multimap将key和value组成的pair作为元素,根据key的排序准则自动将元素排序(因为红黑树也是二叉搜索树,所以map默认是按key排序的),map中元素的key不允许重复,multimap可以重复 。
- map和set的增删改查速度为都是logn,是比较高效的 。
- 为何map和set的插入删除效率比其他序列容器高,而且每次insert之后,以前保存的iterator不会失效?
- 存储的是结点,不需要内存拷贝和内存移动 。
- 插入操作只是结点指针换来换去,结点内存没有改变 。而iterator就像指向结点的指针,内存没变,指向内存的指针也不会变 。
- 为何map和set不能像vector一样有个reserve函数来预分配数据?
- 在map和set内部存储的已经不是元素本身了,而是包含元素的结点 。也就是说map内部使用的Alloc并不是map<Key, Data, Compare, Alloc>声明的时候从参数中传入的Alloc 。
- set的底层实现实现为什么不用哈希表而使用红黑树?
- set中元素是经过排序的,红黑树也是有序的,哈希是无序的
- 如果只是单纯的查找元素的话,那么肯定要选哈希表了,因为哈希表在的最好查找时间复杂度为O(1),并且如果用到set中那么查找时间复杂度的一直是O(1),因为set中是不允许有元素重复的 。而红黑树的查找时间复杂度为O(lgn)
- hash_map与map的区别?什么时候用hash_map,什么时候用map? 构造函数:hash_map需要hash function和等于函数,而map需要比较函数(大于或小于) 。
总的说来,hash_map查找速度比map快,而且查找速度基本和数据量大小无关,属于常数级别 。而map的查找速度是logn级别 。但不一定常数就比log小,而且hash_map还有hash function耗时 。
如果考虑效率,特别当元素达到一定数量级时,用hash_map 。
考虑内存,或者元素数量较少时,用map 。
- 迭代器失效的问题
- 对于vector和string,如果容器内存被重新分配,iterators,pointers,references失效;如果没有重新分配,那么插入点之前的iterator有效,插入点之后的iterator失效;
- 对于deque,如果插入点位于除front和back的其它位置,iterators,pointers,references失效;当我们插入元素到front和back时,deque的迭代器失效,但reference和pointers有效;
- 对于list和forward_list,所有的iterator,pointer和refercnce有效 。
- 对于vector和string,删除点之前的iterators,pointers,references有效;off-the-end迭代器总是失效的;
- 对于deque,如果删除点位于除front和back的其它位置,iterators,pointers,references失效;当我们插入元素到front和back时,off-the-end失效,其他的iterators,pointers,references有效;
- 对于list和forward_list,所有的iterator,pointer和refercnce有效 。
- 对于关联容器map来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用,否则会导致程序无定义的行为 。
- 线程不安全的情况
- 在对同一个容器进行多线程的读写、写操作时;
- 在每次调用容器的成员函数期间都要锁定该容器;
- 在每个容器返回的迭代器(例如通过调用begin或end)的生存期之内都要锁定该容器;
- 在每个在容器上调用的算法执行期间锁定该容器 。
【STL总结与常见面试题】
推荐阅读
- 平南候与狄仁杰谁大 狄仁杰谋反
- 汉朝刘彻母亲是 汉武帝刘彻与刘秀的关系
- 古希腊与中国神话
- 黄茶加工与审评,勐宋沱茶审评滋味
- 赤車使者酒方的功效与作用
- 虾米酒的功效与作用
- 龙葵酒的功效与作用
- 夏英公酒浸饮子的功效与作用
- 二 仙酒方的功效与作用
- 三 豉酒方的功效与作用
