vector,map以及list性能对比

虽然说map是关联容器,一般关联的数据都使用map来存储,但是实际上vector或者list也是可以代替这样的功能

具体实现可以看

https://blog.csdn.net/Think88666/article/details/89430259

比如vector保存一个结构体:

struct stData
{
    int key;
    int value;
}

又或者用vector或者list保存pair对象,再通过std::find或者std::find_if来查找值即可实现和map一样的效果,虽然查找速度不如map,但某些性能是远胜于map的。即使各个容器的内部实现原理不一样,但是我们有必要分析这几个容器性能上的一些区别,以保证初学者能正确的选择容器,从而提升程序的效率

以下是本人测试出的数据:

insert和push_back是指批量顺序插入数据的数量1w 10w ....

find是指从1w 10w.....中查找一条任意数据的最大耗时

 

vector,map以及list性能对比_第1张图片

结论:

map查找数据的速度是最快的(即使数据到达百万级也可以说是毫秒级),但其查找性能是以插入数据时维护底层红黑树作为代价的——即插入数据比较耗时。通过以上数据可以看出,大量数据插入的场景是不适合map的,性能非常低,比vector和list慢几倍甚至十几倍。

map适合偶尔插入一条数据并且很少clear,又频繁查找的场景。

vector插入数据的速度是几者中最好的,即使把vector扩容时的损耗计算在内。并且vector的查找速度比list快,其原因是list可能会多一些判断,比如下一个节点是否存在啊之类的,但是vector就可以直接快速遍历。当然对于查找我们就不用手动遍历了,那样性能太低了,直接使用std::find或者std::find_if就行了,速度会快速倍。

list插入速度稍慢于vector,查找速度也稍慢于vector,但是比较适合频繁的随机删除节点或插入节点的应用场景,因为list就不像vector那样删除或插入节点会导致节点后的数据拷贝。但实则上能不用list就不用吧,list调试起来比较麻烦。

总之,经常动不动就clear,然后大量插入新数据,偶尔查找一下的——那就用vector吧,性能相对极高。

其实少用map也好,用hash_map或者unordered_map代替之,虽然内存会多消耗一些,但是插入删除数据时不需要再维护红黑树而导致速度慢,查找的速度也不亚于map。

你可能感兴趣的:(c++,STL)