[轉載]STL學習之Vector

一、Vector的介紹
向量 vector 是一種對象實體, 能夠容納許多其他類型相同的元素, 因此又被稱爲容器。 與string相同, vector 同屬於STL(Standard Template Library, 標準模板庫)中的一種自定義的數據類型, 可以廣義上認爲是數組的增強版。
在使用它時, 需要包含頭文件 vector, #include
vector 容器與數組相比其優點在於它能夠根據需要隨時自動調整自身的大小以便容下所要放入的元素。此外, vector 也提供了許多的方法來對自身進行操作。
二、vector的聲明及初始化和賦值
vector 型變量的聲明以及初始化的形式也有許多, 常用的有以下幾種形式:

vector<int> a;          //聲明一個int型向量a
vector<int> a(10);      //聲明一個初始大小爲10的向量
vector<int> a(10, 1);   //聲明一個初始大小爲10且初始值都爲1的向量
vector<int> b(a);      //聲明並用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3); //將a向量中從第0個到第2個(共3個)作爲向量b的初始值

數組進行初始化

 int n[] = {1, 2, 3, 4, 5};
 vector<int> a(n, n+5);         //將數組n的前5個元素作爲向量a的初值
 vector<int> a(&n[1],&n[4]);  //將n[1] - n[4]範圍內的元素作爲向量a的初值

賦值
vector賦值給另一個vector:
方法1:

vector<int > v1(v2);   //聲明

方法2:使用swap進行賦值:

vector<int > v1();v1.swap(v2); //將v2賦值給v1,此時v2變成了v1

方法3:使用函數assign進行賦值:

vector<int > v1;//聲明v1
v1.assign(v2.begin(), v2.end());//將v2賦值給v1

方法4:使用循環語句賦值,效率較差

vector<int >::iterator it;  //聲明迭代器
for(it = v2.begin();it!=v2.end();++it) / /遍歷v2,賦值給v1
{                                     
     v1.push_back(it);
}

三、元素的輸入及訪問
元素的輸入和訪問可以像操作普通的數組那樣, 用cin>>進行輸入, cout<

#include<iostream>
    #include<vector>
    using namespace std ;
    int main()
    {
        vector<int> a(10, 0) ;      //大小爲10初值爲0的向量a
        //對其中部分元素進行輸入
        cin >>a[2] ;
        cin >>a[5] ;
        cin >>a[6] ;
        //全部輸出
        int i ;
        for(i=0; i<a.size(); i++)
            cout<<a[i]<<" " ;
        return 0 ;
    }

在元素的輸出上, 還可以使用遍歷器(又稱迭代器)進行輸出控制。在 vector b(a.begin(), a.begin()+3) ; 這種聲明形式中, (a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之間的元素位置。(a.begin(), a.end())則表示起始元素和最後一個元素之外的元素位置。
向量元素的位置便成爲遍歷器, 同時, 向量元素的位置也是一種數據類型, 在向量中遍歷器的類型爲: vector::iterator。 遍歷器不但表示元素位置, 還可以再容器中前後移動。
在上例中講元素全部輸出部分的代碼就可以改寫爲:

//全部輸出
    vector<int>::iterator t ;
    for(t=a.begin(); t!=a.end(); t++)
        cout<<*t<<" " ;

四、Vector的基本操作

1>. a.size()                 //獲取向量中的元素個數
    a.resize(num)           //重新指定容器長度爲num;容器變長則以默認值填充新位置。容器變短,末尾超過容器長度的元素被刪除
2>. a.empty()                //判斷向量是否爲空
3>. a.clear()                //清空向量中的元素
4>. 複製
        a = b ;            //將b向量複製到a向量中,**深度拷貝**
5>. 比較
        保持 ==、!=、>、>=、<、<= 的慣有含義 ;
        如: a == b ;    //a向量與b向量比較, 相等則返回1
6>. 插入 - insert                                    //**insert的位置是迭代器位置,切勿寫成0,1之類;**
        ①、 a.insert(a.begin(), 1000);             //將1000插入到向量a的起始位置前        
        ②、 a.insert(a.begin(), 3, 1000) ;        //將1000分別插入到向量元素位置的0-2處(共3個元素)   
        ③、 vector<int> a(5, 1) ;
            vector<int> b(10) ;
            b.insert(b.begin(), a.begin(), a.end());//將a.begin(), a.end()之間的全部元素插入b.begin()前
7>. 刪除 - erase
        ①、 b.erase(b.begin()) ;                     //將起始位置的元素刪除
        ②、 b.erase(b.begin(), b.begin()+3) ;        //將(b.begin(), b.begin()+3)之間的元素刪除
8>. 交換 - swap
        b.swap(a) ;              //a向量與b向量進行交換
9>.末尾的添加移除-push/back
       vector_a.push_back(1);   //在容器尾部加入一個元素
       vector_a.pop_back;       //移除容器尾部一個元素
10>.元素讀取-front()/back()
      int F=vector_a.front();    //獲得容器的首元素
     int B=vector_a.back();      //獲得容器的尾部元素
11>.元素排序sort() 需要包含algorithm頭文件,默認從小到大

五、二維向量
與數組相同, 向量也可以增加維數, 例如聲明一個m*n大小的二維向量方式可以像如下形式:

    vector< vector<int> > b(10, vector<int>(5));        //創建一個10*5的int型二維向量

在這裏, 實際上創建的是一個向量中元素爲向量的向量。同樣可以根據一維向量的相關特性對二維向量進行操作。

1     #include<iostream>
 2     #include<vector>
 3 
 4     using namespace std ;
 5 
 6     int main()
 7     {
 8         vector< vector<int> > b(10, vector<int>(5, 0)) ;
 9 
10         //對部分數據進行輸入
11         cin>>b[1][1] ;
12         cin>>b[2][2] ;
13         cin>>b[3][3];
14 
15         //全部輸出
16         int m, n ;
17         for(m=0; m<b.size(); m++)           //b.size()獲取行向量的大小
18         {
19             for(n=0; n<b[m].size(); n++)    //獲取向量中具體每個向量的大小
20                 cout<<b[m][n]<<" " ;
21             cout<<"\n" ;
22         }
23 
24         return 0;
25     }

同樣, 按照這樣的思路我們還可以創建更多維的向量, 不過維數太多會讓向量變得難以靈活控制, 三維以上的向量還需酌情使用。
此篇文章大部分參考如下,並在基礎上添加修改。
http://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html

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