1. map是一类关联式容器。底层是用红黑树实现,根据key值有序排列,查找效率很高。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。

 

2. map的插入避免使用[],因为效率很低。

插入元素(<key1, value1>)时,先在map中查找主键key1的项,若没发现,然后将一个新的对象插入map,主键key1,值是一个无效值,插入完成后,将值赋为value1; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。

 

3. map和hash_map性能测试
大家都知道在C++的STL中map是使用树来做查找算法,而hash_map使用hash表来排列配对,是使用关键字来计算表位置。那使用起来他们的差别主要是什么呢?对于性能差别是什么,适合什么情况下应用呢?于是我对它们进行了一些测试,并记录了测试数据供大家分享。
    测试的内容主要是map和hash_map的添加、删除、查找和遍历操作,首先进行了几组测试,分别是10万次、30万次,时间单位均为毫秒,具体的性能对照如下:
  hash_map(10万) map(10万) hash_map(20万) map(20万) hash_map(30万) map(30万)
添加 93   47  156   94  203   172
遍历 16   15  16   16  16   15
查找 0   0  32   31  31   32
删除 8422   32  33765   63  76016   78
   通过上面的数据比较,我们很容易发现hash_map的添加和删除操作比map要慢,尤其是删除操作hash_map比map可能慢1000倍;从而得到结论是删除和插入操作较多的情况下,map比hash_map的性能更好,添加和删除的数据量越大越明显。但我们使用map、hash_map一般都用于查找和遍历较多,而且上述测试数据也不能反映出这两方面的性能差距,于是继续对查找和遍历进行了性能测试,得到具体数据如下,时间单位仍为毫秒:
 hash_map(100万) map(100万) hash_map(200万) map(200万) hash_map(300万) map(300万)
遍历 94   31  203   32  297   47
查找 94   234  188   531  281   875
   通过上面的测试数据可以得出结论是map的遍历性能高于hash_map,而查找性能则相反,hash_map比map要好,数据量越大查找次数越多,表现就越好。
   两大组测试完毕,整体结论也可以得出:一般应用情况下,我们保存的数据不超过100万份,查找的频繁程度不高情况下使用map性能比较好;而保存的数据较多时(超过100万),查找频繁时使用hash_map的性能就高于map

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐