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,無論插入刪除操做是在頭部仍是尾部進行,算法的效率是固定的。spa

只看不寫的程序員不是優秀的程序員,下面咱們用代碼來講明上述問題:設計

先看vector的:code

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的代碼:get

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;qt

能夠看出,在順序訪問上,vector的速度是優於deque的。

 咱們再來看看插入的時候,一樣先看vector的插入:

int main()  
{   
    struct timeval tb1,tb2,tb3;
    unsigned int real_time = 0;

    ifstream ifs("test2.txt");     //在test2.txt的一百萬個數據間操做
    istream_iterator<int> ibeg(ifs);  
    istream_iterator<int> iend;
    vector<int> vec(ibeg, iend);

    gettimeofday(&tb1,NULL);
    vec.insert(vec.begin(),1);   //在開頭位置插入
    
    gettimeofday(&tb2,NULL);
    real_time = tb2.tv_usec - tb1.tv_usec + (tb2.tv_sec - tb1.tv_sec)*1000;                     //獲取開頭位置插入所耗時間
    cout<<"vector head time is "<<real_time<<"us"<<endl;

    vec.insert(vec.end(),1);    //在末尾位置插入
    gettimeofday(&tb3,NULL);
    real_time = tb3.tv_usec - tb2.tv_usec + (tb3.tv_sec - tb2.tv_sec)*1000;                   //在末尾位置插入所耗時間
    cout<<"veator end time is "<<real_time<<"us"<<endl;

    return 0;  
}

執行以後,打印結果爲:vector head time is 780 us

                                vector end time is 87us

 咱們再來看看 deque的:

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

    ifstream ifs("test3.txt");
    istream_iterator<int> qbeg(ifs);
    istream_iterator<int> qend;
    deque<int> deq(qbeg,qend);

    gettimeofday(&qtb1,NULL);
    deq.insert(deq.begin(),1);             //在開頭插入

    gettimeofday(&qtb2,NULL);
    qreal_time = qtb2.tv_usec - qtb1.tv_usec + (qtb2.tv_sec - qtb1.tv_sec)*1000000;
    cout<<"deque head time is "<<qreal_time<<"us"<<endl;

    deq.insert(deq.end(),1);               //在末尾插入
    gettimeofday(&qtb3,NULL);
    qreal_time = qtb3.tv_usec - qtb2.tv_usec + (qtb3.tv_sec - qtb2.tv_sec)*1000000;  
    cout<<"deque end time is "<<qreal_time<<"us"<<endl;
    return 0;
}

執行以後,打印結果爲:deque head time is 1us

                                deque end time is 62us

能夠獲得,在vector和deque進行插入刪除時,deque的效率是高於vector的。當都是在末尾進行插入時,vector和deque的差異不大,可是在對頭部進行插入時,差距十分明顯。

上面的幾條差很少也就論述完了。

總結一下:當進行插入刪除時候,選擇deque,當進行順序訪問時,選擇vector;

相關文章
相關標籤/搜索