闲话就不多扯了,本次测试了qt容器,和stl容器相关的效率,增加自己的理解,毕竟耳听为虚,眼见为实,书和资料怎么说都只是一个理论,直接测试性能才是王道。
流程
qt,stl容器对应关系对比->横向比较每个对应关系容器效率->纵向比较各自容器效率->总结表格。
测试环境:Qt5.7,vs2015。
序、qt,stl容器对应关系对比图
下面这张图片是转载的,正好看到了。该图将qt、stl的顺序容器,和关联容器的对应关系,分别罗列出来了,一目了然,在此引用下。但是缺少容器适配器,所以我在下方自己做了个表,加入的容器适配器。
本图片转载自 点击跳转
从上图能够清楚看到一一对应的关系,所以就不多解释了,下方是自己做的一个表格,主要是补充容器适配器对应关系:
本表格参考来源(cppAPI官网):点击跳转
从代码里我们也能清楚的看到stl的容器适配器的原型:
至此,基本的容器对应关系已经明了,开始比较各容器间的性能。
顺序容器
一、 std::vector与QVector:
理论:
vector的内部存储结构为线性表。在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放,所以对于随机访问的速度很快(按下标),但是对于插入尤其是在头部,中间插入元素速度很慢,在尾部插入速度很快。 并且要vector 达到最优的性能,最好在创建vector 时就指定其空间大小。
特点:随机访问快,插入慢,查找快,尾部增加快。
对比理论:
这两者效率理论上是差不多的,且可以相互转换。QVector的insert是用下标索引,std::vector的insert是用迭代器索引。但实测中QVector一样有迭代器索引方式,并且用这两种方式效率上没有区别。
各自测试:
1、 std::vector: 插入和删除中,从头部和中间insert插入耗时是从尾部插入的十倍,而pushback比insert要高效率很多,erase同样要比pop方式慢上千倍不止,所以除非特殊情况,一般用push和pop。
2、 QVector:同上。
在release版本下,QVector和std::vector在尾部位置insert插入,查找上,较之std::vector稍好一点, push上没有太大区别,但是erase,popback删除上要比std::vector慢上一些;
总结:
对于vector,选择push和pop来增删都是让效率更高的方式,而在选择QVector和std::vector上没有太大的区别,但考虑到pop耗时,一般情况下std::vector更好。
QVector≈std::vector
二、 std::List与QLinkedList与 QList:
理论:
1、std::list和QlinkedList内部结构为双向链表(每一个节点都包括一个信息块&#