C++面试C++

面试总结-C++常见模板内部实现及特性

2018-09-20  本文已影响56人  葛城巧

C++常见模板类的内部实现以及特性总结


前言:面试官总是喜欢问数据结构的具体实现,所以今晚总结下,争取下次不会再回答不出来!唉,悲剧的我~


1. vector

(1)实现方式:

vector内部由数组实现,使用连续的内存存储,属于顺序存储结构。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储。通常此默认的内存分配能完成大部分情况下的存储。

(2)优点:

(3)缺点:

2. list

(1)实现方式:

list内部使用双向链表实现,使用的是非连续的内存空间进行存储,每一个结点都包括一个信息块Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。

(2)优点:

(3)缺点:

3. deque

(1)实现方式:

deque基于双端队列来实现,内部由一段一段(分块)的连续空间构成。vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串接在整个deque的头端或尾端。deque的最大任务,便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的接口。

(2)优点:

(3)缺点:

4. set和multiset

(1)实现方式:

set和multiset的内部均使用一种非常高效的平衡检索二叉树:红黑树来实现。

(2)特性:

5. map和multimap

(1)实现方式:

map和multimap同样采用红黑树来实现。

(2)特性:

6. hash_map

(1)实现方式:

hash_map内部基于hash table(哈希表)来实现。 最大的优点就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间,但代价是消耗比较多的内存。相当于用空间换时间。

(2)与map对比:


总结

  1. 如果需要高效的随机存取,不在乎插入和删除的效率,使用vector
  2. 如果需要大量的插入和删除元素,不关心随机存取的效率,使用list
  3. 如果需要随机存取,并且关心两端数据的插入和删除效率,使用deque
  4. 如果打算查找一个元素是否存在于某集合中,唯一存在的情况使用set,不唯一存在的情况使用multiset
  5. 如果打算存储数据字典,并且要求方便地根据key找到value,一对一的情况使用map,一对多的情况使用multimap

参考文献:

  1. https://blog.csdn.net/alex_xhl/article/details/37692297
  2. https://blog.csdn.net/terence1212/article/details/52487656
  3. https://blog.csdn.net/wl_ss/article/details/78065182
  4. https://blog.csdn.net/aa4790139/article/details/20617023
  5. https://blog.csdn.net/xiajun07061225/article/details/7459206
  6. http://www.cnblogs.com/hdk1993/p/5811577.html
  7. https://blog.csdn.net/weixin_35909255/article/details/70757138
  8. https://blog.csdn.net/wl_ss/article/details/78072909
  9. https://blog.csdn.net/chen134225/article/details/81744367
  10. https://www.cnblogs.com/SWiper/p/6617774.html
  11. https://blog.csdn.net/hero_myself/article/details/52312644
  12. https://blog.csdn.net/sinat_36165006/article/details/55803329
  13. https://www.cnblogs.com/engineerLF/p/5393006.html
上一篇 下一篇

猜你喜欢

热点阅读