C++:STL之vector,deque对比

时间:2021-09-11 04:19:30

之所以专门把STL中的这两个拿出来说一说,是因为vector和deque都是支持随机访问的,其支持的迭代器类型都为随机访问,而不像map,set,list等都是支持双向迭代器的。

vector,deuqe之对比:

1:随机访问速度:vector > deque。

2;deque性能损失比vector高几个数量级:因为deque首次插入一个元素时,会默认动态分配512字节空间,当这512字节空间用完后,它会再动态分配自己另外的512字节空间,然后虚拟地连在一起。deque的这种设计使得它具有比vector复杂得多的架构、算法和迭代器设计,也使得性能损失比vector高!

3:在插入删除操作时,deque由于vector:对于vector而言,由于其是一端开口,所以在尾部插入耗费固定的时间,而在头部进行插入时,耗费的时间与vector的大小成正比,vector越大,耗费的时间越多。而对于deque,不管插入删除操作是在头部还是尾部进行,算法的效率是固定的。

只看不写的程序员不是优秀的程序员,下面我们用代码来说明上述问题:

先看vector的:

 

int main()  
{   
    struct timeb tb1,tb2;         //定义时间,以便计算程序前后的执行时间
    unsigned int real_time = 0;

    ifstream ifs("test1.txt");     //我在test1.txt里存放了一百万个数
    ofstream ofs("test2.txt");         //将整理后的数据存放到test2.txt里
    istream_iterator<int> ibeg(ifs);  
    istream_iterator<int> iend;        //无参数默认为end
    ostream_iterator<int> iwrt(ofs," ");    
    vector<int> vec(ibeg, iend);        //定义vector

    ftime(&tb1);
    sort(vec.begin(),vec.end());        //对一百万个数据进行排序
    copy(vec.begin(),vec.end(),iwrt);    //写入到目标文件内
    
    ftime(&tb2);
    real_time = tb2.millitm - tb1.millitm + (tb2.time - tb1.time)*1000;//得到完成排序和写入操作的执行时间
    cout<<"vector time is "<<real_time<<"ms"<<endl;    
    return 0;  
}

 

执行后输出结果为:vector time is 1646ms。

我们再来看看deque的代码:

int main()
{
    struct timeb qtb1,qtb2;
    unsigned qreal_time = 0;

    ifstream ifs("test1.txt");
    ofstream ofs("test3.txt");      //将处理后的数据写入到test3.txt内
    istream_iterator<int> qbeg(ifs);
    istream_iterator<int> qend;
    ostream_iterator<int> qwrt(ofs," ");
    deque<int> deq(qbeg,qend);   

    ftime(&qtb1);
    sort(deq.begin(),deq.end());
    copy(deq.begin(),deq.end(),qwrt);

    ftime(&qtb2);
    qreal_time = qtb2.millitm - qtb1.millitm + (qtb2.time - qtb1.time)*1000;
    cout<<"deque time is "<<qreal_time<<"ms"<<endl;
    return 0;
}

执行后输出结果为:deque time is 4396ms;

可以看出,在顺序访问上,vector的速度是优于deque的。

 

我们再来看看插入的时候,同样先看vector的插入:

 

C++:STL之vector,deque对比C++:STL之vector,deque对比
 1 int main()  
 2 {   
 3     struct timeval tb1,tb2,tb3;
 4     unsigned int real_time = 0;
 5 
 6     ifstream ifs("test2.txt");     //在test2.txt的一百万个数据间操作
 7     istream_iterator<int> ibeg(ifs);  
 8     istream_iterator<int> iend;
 9     vector<int> vec(ibeg, iend);
10 
11     gettimeofday(&tb1,NULL);
12     vec.insert(vec.begin(),1);   //在开头位置插入
13     
14     gettimeofday(&tb2,NULL);
15     real_time = tb2.tv_usec - tb1.tv_usec + (tb2.tv_sec - tb1.tv_sec)*1000;                     //获取开头位置插入所耗时间
16     cout<<"vector head time is "<<real_time<<"us"<<endl;
17 
18     vec.insert(vec.end(),1);    //在末尾位置插入
19     gettimeofday(&tb3,NULL);
20     real_time = tb3.tv_usec - tb2.tv_usec + (tb3.tv_sec - tb2.tv_sec)*1000;                   //在末尾位置插入所耗时间
21     cout<<"veator end time is "<<real_time<<"us"<<endl;
22 
23     return 0;  
24 }
View Code

 

执行之后,打印结果为:vector head time is 780 us

                                vector end time is 87us

 

 我们再来看看 deque的:

C++:STL之vector,deque对比C++:STL之vector,deque对比
 1 int main()
 2 {
 3     struct timeval qtb1,qtb2,qtb3;
 4     unsigned qreal_time = 0;
 5 
 6     ifstream ifs("test3.txt");
 7     istream_iterator<int> qbeg(ifs);
 8     istream_iterator<int> qend;
 9     deque<int> deq(qbeg,qend);
10 
11     gettimeofday(&qtb1,NULL);
12     deq.insert(deq.begin(),1);             //在开头插入
13 
14     gettimeofday(&qtb2,NULL);
15     qreal_time = qtb2.tv_usec - qtb1.tv_usec + (qtb2.tv_sec - qtb1.tv_sec)*1000000;
16     cout<<"deque head time is "<<qreal_time<<"us"<<endl;
17 
18     deq.insert(deq.end(),1);               //在末尾插入
19     gettimeofday(&qtb3,NULL);
20     qreal_time = qtb3.tv_usec - qtb2.tv_usec + (qtb3.tv_sec - qtb2.tv_sec)*1000000;  
21     cout<<"deque end time is "<<qreal_time<<"us"<<endl;
22     return 0;
23 }
View Code

执行之后,打印结果为:deque head time is 1us

                                deque end time is 62us

可以得到,在vector和deque进行插入删除时,deque的效率是高于vector的。当都是在末尾进行插入时,vector和deque的差别不大,但是在对头部进行插入时,差距十分明显。

上面的几条差不多也就论述完了。

总结一下:当进行插入删除时候,选择deque,当进行顺序访问时,选择vector;