虽然说map是关联容器,一般关联的数据都使用map来存储,但是实际上vector或者list也是可以代替这样的功能。
具体实现可以看
vector或list保存结构体或对象时的查找方法_宇龍_的博客-CSDN博客
比如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.....中查找一条任意数据的最大耗时
结论:
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。