您的位置:首页 > 其它

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

2017-08-17 18:33 1686 查看
其实微软的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  毫秒

(注意最后一个没有运行完,程序自动退出,应该是内存不够导致程序自动退出。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: