STL vector的簡單用法


<span style="font-size:18px;">STL中的vector實際上是一種稱爲動態表的數據結構。所謂動態表,是指一種能夠自動擴張和收縮的表。在開始的時候動態表預先分配一塊連續的存儲空間,將表中的元素存儲在這塊連續的空間內;如果不斷地向表中插入元素,最終原來的那塊存儲空間可能會不夠用,這時候動態表就會自動分配一塊更大的存儲空間,並將表中原來的元素全部複製到這塊較大的空間內。</span>
<span style="font-size:18px;">vector的擴充機制:按照容器現在容量的一倍進行增長。 vector容器分配的是一塊連續的內存空間,每次容器的增長,並不是在原有連續的內存空間後再進行簡單的疊加, 而是重新申請一塊更大的新內存,並把現有容器中的元素逐個複製過去,然後銷燬舊的內存。 這時原有指向舊內存空間的迭代器已經失效,所以當操作容器時,迭代器要及時更新。vector可以用來取代數組,因爲它有自動分配內存,邊界檢測等很多優點。聲明一個存放T類型變量的vector的代碼如下所示:
vector<T> L;
訪問L的第i個元素的方法也和數組訪問類似,只需要調用L[i]即可,STL重載了vector的[]操作符。
需要指出的時,正如前面所分析的,新建立的vector對象所分配的空間是0。如果聲明瞭一個vector,而沒有向其中插入任何元素,就利用數組下標來訪問其第i個元素,會造成越界錯誤。只有向vector L 中插入了n個元素後,才能用數組下標方位L[0..n-1]。
也可以在聲明vector的同時就指明vector需要預先保留的空間,</span>
<span style="font-size:18px;">例如:
vector<T> L(size);
這就聲明瞭一個vector L,且初始保留size個空間,這時就可以直接用數組下標訪問L[0..size-1]了。</span>
<span style="font-size:18px;">使用vector注意事項:
1. 用下標存取第i個對象的時候,要注意防止越界;但vector會判斷出這種越界並在運行時拋出一個異常,這點比C中的數組要安全。
2. 如果預先知道vector所需保存的元素的最大大小,最好在聲明vector的時候就指明。例如:
const int MAX_N = 1000;
vector<int> A(1000, 0); // 聲明一個1000個元素的vector,並初始化爲0
for (int i = 0; i < A.size(); i++) {
A[i] = i;
cout << A[i] << endl;
}
3. 因爲vector使用動態表實現,所以在其開頭和中間插入和刪除元素效率會很低,因爲要移動後面的其他元素。但vector提供了隨機存儲的機制,即隨機存取第i個元素只需要O(1)的時間。</span>
<span style="font-size:18px;"></span><pre class="cpp" name="code">#include <iostream>
#include <vector> //必須包含頭文件
using namespace std;

int main()
{
    //幾種vector聲明
    vector<int>v1;        //定義空的vector
    vector<int>v2(10);    //產生大小爲10的vector
    vector<int>v3(10,-1);    //產生大小爲10,並且每個元素都是-1的vector
    vector<int>v4(v3);        //用一個vector產生一個vecotr
    
    int arr[5]={1,2,3,4,5};
    vector<int>v5(arr,&arr[5]);    //以區間[beg;end)做爲初值的vector

    cout<<"當前元素數量"<<v5.size()<<endl;
    cout<<"v1大小是否爲0:"<< (v1.empty()?"空":"不空")<<endl;
    cout<<"v2大小是否爲0:"<< (v2.empty()?"空":"不空")<<endl;
    cout<<"v1可容納的元素最大數量:"<<v1.max_size()<<endl;    //電腦內存4GB
    cout<<"v2可容納的元素最大數量:"<<v2.max_size()<<endl;
    cout<<"v2重新分配前所能容納的元素最大數:"<<v2.capacity()<<endl;
    v2.reserve(20); //給v2重新分配20個空間
    cout<<"v2.reserve(20)後重新分配前所能容納的元素最大數:"<<v2.capacity()<<endl;
    cout<<"v3 v4是否相等:"<<(v3==v4 ? "相等":"不等")<<endl;


    v1.push_back(11);//在尾部添加一個元素1
    v1.push_back(22);
    v1.push_back(33);

    //迭代器是隨機存取迭代器,對vector來說就是指針,迭代器持續有效
    //除非在一個較小索引位置插入刪除元素或者內存重新分配
    vector<int>::iterator ita; //聲明一個迭代器
    int i=0;
    for(ita=v1.begin(), i=0;ita != v1.end();i++,ita++)//v1.begin()指向v1的第一個元素,v1.end()指向最後元素的下一位置
    {
        cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
    }
    v1.pop_back();//在尾部刪除一個元素
    for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
    {
        cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
    }

    //跟v1.begin()和v1.end()對應的有v1.rbegin()和v1.rend(),
    //v1.begin()指向逆向的第一個元素,v1.end()指向逆向最後元素的下一位置,使用    vector<int>::reverse_iterator ita;

    v2=v1; //將v1的元素全部拷到v2
    for(ita=v2.begin(),i=0;ita != v2.end();i++,ita++)
    {
        cout<<"v2中的"<<i<<"值:"<<v2[i]<<endl;
    }
    //v2.clear();
    v2.assign(3,44);    
    for(ita=v2.begin(),i=0;ita != v2.end();i++,ita++)
    {
        cout<<"v2中的"<<i<<"值:"<<v2[i]<<endl;
    }
    v2.assign(arr,&arr[5]);    
    for(ita=v2.begin(),i=0;ita != v2.end();i++,ita++)
    {
        cout<<"v2中的"<<i<<"值:"<<v2[i]<<endl;
    }

    v1.swap(v2);
    //swap(v1,v2);
    cout<<"v1第2個元素"<<v1.at(1)<<endl;    //越界拋出異常
    //cout<<"v1第6個元素"<<v1[5]<<endl;  //越界,不檢查
    cout<<"v1首個元素"<<v1.front()<<endl;
    cout<<"v1最後元素"<<v1.back()<<endl;

    vector<int>::iterator pos=v1.begin();
    v1.insert(pos,11);
    //v1.insert(pos,4,55); //如果直接用就是錯的,因爲迭代器失效了
    //v1.insert(pos,arr,&arr[5]);
    for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
    {
        cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
    }
    cout<<endl;
    pos=v1.begin(); //因爲直接用迭代器失效,所以重新聲明下
    v1.erase(++pos); //刪除制定位置
    for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
    {
        cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
    }
    cout<<endl;
    pos=v1.begin(); 
    v1.erase(pos,pos+3);
    for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
    {
        cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
    }
    cout<<endl;

    //v1.resize(5); //將元素數量改成5,如果v1變大,則多的按默認走
    v1.resize(5,9); //將元素數量改成5,如果v1變大,則多的賦值成9
    for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
    {
        cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
    }
    cout<<endl;

    v1.clear(); //清空


    system("pause");
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章