1. map是如何实现的?它的keys是否经过排序?如何实现它的clear方法?
A 实现:
map是通过红黑树来实现的,keys是经过排序的;
map的所有元素都是pair,同时拥有实值(value)和键值(key),pair的第一个元素被视为key,第二个元素被视为value;
map不允许两个元素拥有相同的键值;
map的插入删除操作,不会使迭代器失效。
增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。
B 功能:
- 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
- 快速插入Key - Value 记录。
- 快速删除记录
- 根据Key 修改value记录。
- 遍历所有记录。
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个方面来权衡:查找速度, 数据量, 内存使用,还有一个就是你的经验!没有特别的标准