stl的vector和list的push_back效率比较

70 篇文章 0 订阅

         今天遇到一个问题,在与同事讨论问题的时候,提到vector的push_back是否很快的时候。自己不假思索的认为,如果没有随机读的需求的话,换成链表的方式,会有更快的插入效率。但只是根据一些经验性的做出判断。原因如下:list每插入一个节点,是O(1)的时间复杂度,不需要其他什么操作。而vector如果插入的话,则需要重复分配内存,需要更大空间,这必然很耗时的操作,所以认为list的push_back效率比vector更快。

          但自己心里还是没什么底,好吧,写个测试代码试一下,看一下结果如何。

          

#include <vector>
#include <list>
using namespace std;
long getCurrentTime()    
{    
    struct timeval tv;    
    gettimeofday(&tv,NULL);    
    return tv.tv_sec * 1000 + tv.tv_usec / 1000;    
}    

const int MAX_TIMES = 10000;
int main(int argc, char ** argv) {
    list<int> l_tmp;
    vector<int> v_tmp;
    long tickStart = getCurrentTime();

    cout<<"tickStart = "<<tickStart<<endl;

    for (int i = 0; i < MAX_TIMES; ++i) {
        v_tmp.push_back(i);
    }

    long tickEnd = getCurrentTime();
    cout << "tickEnd = " << tickEnd << endl;
    cout << "time takes = " << tickEnd - tickStart << endl;


    tickStart = getCurrentTime();
    for (int i = 0; i < MAX_TIMES; ++i) {
        l_tmp.push_front(i);
    }

    tickEnd = getCurrentTime();
    cout << "tickEnd = " << tickEnd << endl;
    cout << "time takes = " << tickEnd - tickStart << endl;

    cout << "hello " << endl;

    return 0;
}

测试机器是自己的一台mac air。

测试结果分三组数据,分别插入10万,100万,1000万,

测试结果分别为:

 vectorlist
10万415
100万32139
1000万3001297

测试结果让自己惊讶,与预期完全相反。。在windows机器上做了一遍测试,结果也是一样。


分析:

1、vector的push_back虽然在内存不足的时候会重新申请内存,但它申请内存是预先申请原来多一倍的空间,所以很多时候均是直接往内存里面写数据即可,效率非常高。

2、list的push_back,虽然是增加一个节点。但每个新增节点的时候,都是new了一块新内存出来,再连到链表上去。new这个操作是非常吃内存的。


综上两个原因,如果在大量尾部插入的情况下,vector的push_back效率还是要高于list的push_back的。不要被自己的经验所困住,多动手实践才是王道。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值