1. 程式人生 > >一、Vector向量容器

一、Vector向量容器

簡介:Vector向量容器可以簡單的理解為一個數組,它的下標也是從0開始的,也就是說,如果vector容器的大小是n,那麼,元素的下標是0~n-1。使用時可以不用確定大小。vector具有記憶體自動管理的功能,對於元素的插入和刪除,它可以進行動態調整所佔用的記憶體空間,它裡面有很多系統已經定義好了的函式方法,可以直接呼叫進行插入元素與在尾部擴張元素。Vector是一種簡單高效的容器,完全可以代替陣列。

函式方法總結:

1. 使用vector向量容器,需要標頭檔案 “ #include<vector> ”

2. 尾部元素擴張   push_back()

3. 返回首元素位置的迭代器       begin();

4. 返回最後一個元素的下一元素位置的迭代器       end();

5. 元素的插入  insert();

6. 元素的刪除      

(1).刪除vector中迭代器所指的一個元素或一段區間中的所有元素        erase();

(2).一次性刪除vector中的所有元素        clear();

7. 反向排序 reverse();(使用時需要在標頭檔案進行宣告#include < algorithm >)       

8. 對向量元素進行排序(預設為升序排列)sort(); (使用時需要定義標頭檔案“#include < algorithm >”)     

9. 向量大小size();

10. 判斷向量是否為空empty();

 

Vector向量容器的用法:

  1. 使用Vector向量容器,需要在標頭檔案宣告 “ #include< vector > ”。
  2. 建立vector物件的三種形式(向量的元素型別可以是int,double,char等簡單型別,也可以是結構體或者string基本字元序列容器)。

        (1)vector< int >  v;   //儲存整形的容器v。

      (2)vector< int >  v(10);  //儲存10個int型別的向量容器,這裡的每一個元素都為0。

        (3)vector< double >  v(10,2.02);  //儲存10個double型別的向量容器,每個值都為2.02。

3. 使用迭代器進行遍歷

vector<double>::iterator it;    //定義迭代器變數it。

for(it=v.begin();it!=v.end();it++)  //從首元素到最後一個元素的下一個元素位置結束

    {

        cout << *it << endl; //將這10個double型別的元素輸出出來

    }

   

1,for迴圈遍歷訪問vector元素

#include <iostream>

#include<vector>

using namespace std;     //因為C++STL泛型都是定義在std名稱空間中,所以,必須在標頭檔案宣告的最後一句加上這一行

 

int main()

{

    vector<double> v (10,5.20);//定義一個儲存10個double型別元素的向量容器,其中的每一個元素都為5.20

    v[5] = 10.24;    //對v[5]進行重新賦值

    v[9] = 88.48;    //對v[9]進行重新賦值

    for ( int i=0; i<10; i++ )

    {

        cout << v[i] << endl;//將這10個double型別的元素輸出出來

    }

return 0;

}

結果如下:

2,用迭代器訪問vector元素

使用迭代器配合迴圈語句對vector物件進行遍歷訪問,迭代器的型別一定要與它要遍歷的vector物件的元素型別一致。

#include <iostream>

#include<vector>

using namespace std;

int main()

{

    vector<double> v(10,10.24);//定義一個儲存10個double型別元素的向量容器,其中的每一個元素都為10.24

    v[5]=10.99;      //對v[5]進行重新賦值

v[9]=88.10;   //對v[9]進行重新賦值

 

vector<double>::iterator it;    //定義迭代器變數it

 

    for( it=v.begin() ; it!=v.end() ; it++)  //從首元素到最後一個元素的下一個元素位置結束

    {

        cout << *it << endl;//將這10個double型別的元素輸出出來

    }

 

    return 0;

}

結果如下:

//這裡我有個疑問,最後輸出的v[9],是88.1,而不是88.10。不知道是為什麼,希望有人可以解答一下。

3,尾部元素擴張與元素插入

通常使用push_back()對vector容器在尾部追加新元素。尾部追加元素,vector容器會自動分配新的記憶體空間。

Insert()可以在vector物件的任意位置前插入一個新的元素,同時vector自動擴張一個元素空間,插入位置後的所有元素依次向後挪動一個位置。

 

#include <iostream>

#include<vector>

using namespace std;

int main()

{

    vector<double> v (10,1);

    v[5]=9.9;    //對v[5]進行重新賦值

    v[9]=8.80;   //對v[9]進行重新賦值

    vector<double>::iterator it;    //定義迭代器變數it

 

    for(it= v.begin();it!=v.end();it++)  //從首元素到最後一個元素的下一個元素位置結束

    {

        cout << *it <<" "; //將這10個double型別的元素輸出出來

    }

    cout<<endl;

 

    v.push_back(2);  //將2這個元素從尾部新增到v向量容器中去

    v.push_back(5);  //將5這個元素從尾部新增到v向量容器中去

 

    v.insert(v.begin(),8);   //在v向量容器的最前面加入一個新元素8

    v.insert(v.begin()+2,2); //在第二個元素前插入新元素1

 

    v.insert(v.end(),3);  //在v向量容器末尾追加新元素3

 

    for(it=v.begin();it!=v.end();it++)  //從首元素到最後一個元素的下一個元素位置結束

    {

        cout << *it <<" ";  //將這10個double型別的元素輸出出來

    }

    cout<<endl;

 

    v.clear();   //將v這個向量容器給清空

    cout<<v.size()<<endl;   //輸出v這個向量容器的大小

 

    return 0;

}

結果如下:

 

4,erase()元素刪除

erase()可以刪除vector中迭代器所指的一個元素或者一段區間中的所有元素。

Clear()一次性刪除vector中的所有元素

程式碼如下:

#include<iostream>

#include<vector>

using namespace std;

int main()

{

        vector<int> v(10);

        for(int i=0;i<10;i++)

        {

                 v[i]=i;

        }

        vector<int>::iterator it;//定義迭代器變數it

 

        v.erase(v.begin()+2);//刪除第二個元素,從0開始計數

 

       

        for(it=v.begin();it!=v.end();it++)

        {

                 cout<<*it<<" ";//輸出迭代器上的元素

        }

 

        cout<<endl;

 

        v.erase(v.begin()+1,v.begin()+5);//刪除第一到第五之間的所有元素(注意:刪除的是[1-5),即如果元素是從零到九,則刪除1,2,3,4)

       

        for(it=v.begin();it!=v.end();it++)

        {

                 cout<<*it<<" ";//輸出迭代器上的所有值

        }

        cout<<endl;

 

        v.clear();//清空容器內的所有元素

        cout<<v.size()<<endl;//輸出容器的大小

        return 0;

}

結果如下:

5,reverse反向排序演算法

reverse演算法可以將向量中的某段迭代器區間元素反向排列。

 

程式碼如下:

#include <iostream>

#include<algorithm>

#include<vector>

using namespace std;

int main()

{

    vector<int>v(10,1); //定義一個整形的大小為10個元素且均為1的v向量容器

    vector<int>::iterator it;   //定義迭代器變數it

 

    for(int i=0;i<10;i++)   //將v向量容器進行重新賦值0~9;

    {

        v[i]=i;

    }

        for(it=v.begin();it!=v.end();it++)  //原樣遍歷輸出v向量容器

    {

        cout<<*it<<" ";

    }

    cout<<endl;

 

reverse(v.begin(),v.end());//反向排列向量的從首到尾之間的元素

 

    cout<<"反向排序後:"<<endl;

    for(it=v.begin();it!=v.end();it++)  //反向排序後遍歷輸出v向量容器

    {

        cout<<*it<<" ";

    }

    cout<<endl;

    return 0;

}

結果如下:

6,對向量容器元素排序(預設排序為升序) sort();

Sort演算法要求使用隨機訪問迭代器進行排序,預設進行升序排列。

例如:

#include <iostream>

#include<algorithm>

#include<vector>

using namespace std;

//C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程式設計師告訴編譯器某值是保持不變的。如果在程式設計中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。

bool beyond(const int &a,const int &b)//自己定義比較函式,要求由大到小排序

{

        if(a!=b)return a>b; //如果a,b不相等的話返回a和b之間的最大值

        else return a<b;    //否則返回a和b之間的最小值

}

 

int main()

{

    vector<int>v(10,1);//定義一個整形的大小為10個元素且均為1的向量容器

   

        vector<int>::iterator it;   //定義迭代器變數it

 

    for(int i=0;i<10;i++)   //將v向量容器進行重新賦值9~0;

    {

        v[i]=i;

    }

   

    sort(v.begin(),v.end());  //sort函式方法預設情況下對向量容器進行升序排列

 

    for(it=v.begin();it!=v.end();it++)

    {

        cout<<*it<<" ";

    }

cout<<endl;

cout<<endl;

 

    sort(v.begin(),v.end(),beyond); //自己定義sort()排序方式

 

    for(it=v.begin();it!=v.end();it++)

    {

        cout<<*it<<" ";

    }

    cout<<endl;

 

    return 0;

}

結果如下: