zoukankan      html  css  js  c++  java
  • C++:STL之vector,deque对比

    之所以专门把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的插入:

     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的:

     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;

  • 相关阅读:
    c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变
    C# 一个数组未赋值引发的错误
    c# 2016QQ自动登录程序
    当时钟事件声明为过程变量 让system.threading.timer时钟失效
    if 循环的深入理解 哈希表的一种应用
    VB6对象与地址相互转换
    VB6的函数指针传递
    .net framework 4.0 从 GAC 卸载 程序集
    .net framework 4.0 从 GAC 卸载 程序集
    GAC in CLR 3.0
  • 原文地址:https://www.cnblogs.com/rade/p/3512597.html
Copyright © 2011-2022 走看看