笔试之STL

时间:2022-06-12 14:11:02

1. map是如何实现的?它的keys是否经过排序?如何实现它的clear方法?


  A 实现:

  map是通过红黑树来实现的,keys是经过排序的;

  map的所有元素都是pair,同时拥有实值(value)和键值(key),pair的第一个元素被视为key,第二个元素被视为value;

  map不允许两个元素拥有相同的键值;

  map的插入删除操作,不会使迭代器失效。

  增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。

  B 功能:

  1. 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
  2. 快速插入Key - Value 记录。
  3. 快速删除记录
  4. 根据Key 修改value记录。
  5. 遍历所有记录。

  C 性能问题:

  enumMap[2] = "Two";

  这样非常直观,但存在一个性能的问题。

  1)查找操作:插入2时,先在enumMap中查找主键为2的项;

  2)插入对象:如果查找没有发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串;

  3)赋值操作。插入对象完成后,将字符串赋为"Two";

  该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:

enumMap.insert(map<int, CString> :: value_type(, "Two"))

  

  D clear方法的实现:

2. hash_map的实现原理以及与map的对比,什么时候该使用map,什么时候该使用hash_map?


  hash_map 的用法和 map 是一样的,提供了 insert,size,count等操作,并且里面的元素也是以 pair 类型来存贮的。虽然对外部提供的函数和数据类型是一致的,但是其底层实现是完全不同的,map底层的数据结构是rb_tree而,hansh_map却是哈希表来实现的。

  对比:  

  查找速度:hash_map 查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别;

  hash 还有 hash 函数的耗时。当有100w条记录的时候,map也只需要20次的比较,200w也只需要21次的比较!所以并不一定常数就比log(n) 小!

  内存空间:

  hash_map对空间的要求要比map高很多,所以是以空间换时间的方法,而且,hash_map如果hash函数和hash因子选择不好的话,也许不会达到你要的效果,所以至于用map,还是hash_map,从3个方面来权衡:查找速度, 数据量, 内存使用,还有一个就是你的经验!没有特别的标准