微软vs stl中vector和list的效率比较

其实微软的stl list是一个比较鸡肋的东西。

按照理解,链表(list)的插入和删除时间和空间开销应该比顺序表(vector)的效率更高。考虑删除操作,由于vector删除的时候,会存在内存拷贝,所以时间和空间效率开销肯定较之于list大,这个毫无疑问。但是令我始料不及的是list的push_back操作竟然比vector慢,而且慢很多。

根据笔者推断有可能是由于stl的list是双向链表,所以这种push_back会涉及到内存的分配和列表关系的维护,所以导致时间开销大。但是实际上vector频繁的push_back,会使得预留空间不够的时候,重新申请空间导致的不必要的开销。

stl要是有一个单向链表该有多好呀。

以下是比较list和vector的push_back及顺序访问速度的程序及结果。

复制代码
 1 #include <vector>
 2 #include <iostream> 
 3 #include <list>
 4 #include <time.h>
 5 using namespace std;
 6 
 7 
 8 int _tmain(int argc, _TCHAR* argv[])
 9 {
10     cout<<"Test Vector and list time"<<endl;
11     unsigned int N=10000;
12     int count = 0;
13     while( count<=6)
14     {
15         vector<unsigned int > vecUint;
16         list<unsigned int > listUint;
17         clock_t start, finish;  
18 
19         cout<<"N ==  "<<N<<endl;
20         start = clock();  
21         for(unsigned int i=0;i<N;++i)
22         {
23             vecUint.push_back(i);
24         }
25         finish = clock();  
26         cout<<"vector push_back时间时间为  "<<(finish- start) <<"  毫秒"<<endl;  
27 
28         start = clock();  
29         for(unsigned int i=0;i<N;++i)
30         {
31             listUint.push_back(i);
32         }
33         finish = clock();  
34         cout<<"list push_back时间时间为  "<<(finish- start) <<"  毫秒"<<endl;  
35 
36         start = clock();  
37         for(unsigned int i=0;i<N;++i)
38         {
39             vecUint[i];
40         }
41         finish = clock();  
42         cout<<"vector 访问元素时间为  "<<(finish- start) <<"  毫秒"<<endl;  
43 
44         start = clock();  
45         for(list<unsigned int>::iterator iter=listUint.begin();iter!=listUint.end();++iter)
46         {
47             *iter;
48         }
49         finish = clock();  
50         cout<<"list 访问元素时间时间为  "<<(finish- start) <<"  毫秒"<<endl;  
51 
52         ++count;
53         N *=10;
54         vecUint.clear();
55         listUint.clear();
56     }
57 
58     return 0; 
59 }
复制代码

结果如下:

Test Vector and list time
N ==  10000
vector push_back时间时间为  2  毫秒
list push_back时间时间为  15  毫秒
vector 访问元素时间为  1  毫秒
list 访问元素时间时间为  8  毫秒
N ==  100000
vector push_back时间时间为  29  毫秒
list push_back时间时间为  147  毫秒
vector 访问元素时间为  5  毫秒
list 访问元素时间时间为  76  毫秒
N ==  1000000
vector push_back时间时间为  275  毫秒
list push_back时间时间为  1466  毫秒
vector 访问元素时间为  46  毫秒
list 访问元素时间时间为  765  毫秒
N ==  10000000
vector push_back时间时间为  2755  毫秒
list push_back时间时间为  14659  毫秒
vector 访问元素时间为  477  毫秒
list 访问元素时间时间为  7631  毫秒
N ==  100000000
vector push_back时间时间为  27538  毫秒
(注意最后一个没有运行完,程序自动退出,应该是内存不够导致程序自动退出。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值