其实微软的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 毫秒
(注意最后一个没有运行完,程序自动退出,应该是内存不够导致程序自动退出。)