1. 程式人生 > >【C++ STL】細數C++ STL 的那些事---vector (動態陣列)

【C++ STL】細數C++ STL 的那些事---vector (動態陣列)

一,vector概述

        vector是一個順序容器,可以存放各種型別的物件,簡單地說,vector是一個能夠存放任意型別的動態陣列,能夠增加和壓縮資料。

        vector是動態空間,隨著元素的增加內部機制可以自行擴充空間,而array則是固定大小空間,如果想增加空間,需要再重新申請空間,然後將原來元素拷貝到新空間中。

       【注意】vector動態增加大小,不是在原空間之後連結新空間(因為無法保證原空間之後尚有可供配置的空間),而是以原大小的兩倍另外配置一塊比較大的空間,然後將原內容拷貝過來,然後才開始在原記憶體之後構造新元素,並釋放原空間。因此對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了,這是程式設計師易犯的一個錯誤,務必小心。

二,使用

  #include <vector>   vector屬於std命名域的,因此需要通過命名限定,如下完成你的程式碼:   using std::vector;   std::vector<int> vInts;    //或者連在一起,使用全名:
  建議在程式碼量不大,並且使用的名稱空間不多的情況下,使用全域性的命名域方式:using namespace std;

三,主要方法

  vector<Elem>     c                      //建立一個空的vector

        vector<Elem>     c1(c2)            //複製一個vector

        vector <Elem>   c(n)                   //建立一個vector,含有n個數據,資料均已預設構造產生

        vector <Elem>   c(n,elem)        //建立一個含有n個elem拷貝的vector

        vector <Elem>    c(beg,end)      //建立一個以(beg;end)為區間的vector

        c.~ vector <Elem>()                //銷燬所有資料,釋放記憶體

  c.assign(beg,end)                  //將(beg; end)區間中的資料賦值給c


        c.assign(n,elem)                    //將n個elem的拷貝賦值給c。

  c.at(idx)            //傳回索引idx所指的資料,如果idx越界,丟擲out_of_range。
  c.back()           //傳回最後一個數據,不檢查這個資料是否存在。
  c.begin()          //傳回迭代器中的第一個資料地址。
  c.capacity()     //返回容器中資料個數。
  c.clear()           //移除容器中所有資料。
  c.empty()          //判斷容器是否為空。

  c.end()                     //指向迭代器中末端元素的下一個,指向一個不存在元素。

  c.erase(pos)           //刪除pos位置的資料,傳回下一個資料的位置。   c.erase(beg,end)   //刪除beg 到 end 位置的所有元素
  c.front()                    //傳回第一個資料。
  get_allocator           //使用建構函式返回一個拷貝。   c.insert(pos,elem)          //在pos位置插入一個elem拷貝,傳回新資料位置   c.insert(pos,n,elem)      //在pos位置插入n個elem資料,無返回值   c.insert(pos,beg,end)   //在pos位置插入在[beg,end)區間的資料。無返回值   c.max_size()                  //返回容器中最大資料的數量。   c.pop_back()                 //刪除最後一個數據。   c.push_back(elem)      //在尾部加入一個數據。
  c.rbegin()                       //傳回一個逆向佇列的第一個資料。   c.rend()                          //傳回一個逆向佇列的最後一個數據的下一個位置。   c.resize(num)                //重新指定佇列的長度。   c.reserve()                     //保留適當的容量。   c.size()                           //返回容器中實際資料的個數。   c1.swap(c2)                 //將c1和c2元素互換   swap(c1,c2)                 //將c1和c2元素互換

  operator[]                      //返回容器中指定位置的一個引用

四,evctor 例子  

  1)訪問vector中的資料          vector::at()          vector::operator[]                operator[]主要是為了與C語言進行相容。它可以像C語言陣列一樣操作。但at()是我們的首選,因為at()進行了邊界檢查,如果訪問超過了vector的範圍,將丟擲一個例外。由於operator[]容易造成一些錯誤,所有我們很少用它,下面進行驗證一下:   分析下面的程式碼:   vector<int> v;   v.reserve(10);   for(int i=0; i<7; i++) {       v.push_back(i); //在V的尾部加入7個數據   }

  try {

             int iVal1 = v[7];

       int iVal2 = v.at(7);   }   catch(const exception& e) {      cout << e.what();

  }


      2)vector 的構造與記憶體管理 constructor ,  push_back()

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int main(int argc, char** argv) {
    int i;
    vector<int> iv(2,9);   //首先建立有兩個元素的 vector
    
    cout<<"size="<<iv.size()<<"  "<<"capacity="<<iv.capacity()<<endl;   //2  2
    
    iv.push_back(1);//在最後插入元素 1
    cout<<"size="<<iv.size()<<"  "<<"capacity="<<iv.capacity()<<endl;   //3  4
    
    iv.push_back(2);//在最後插入元素 1
    cout<<"size="<<iv.size()<<"  "<<"capacity="<<iv.capacity()<<endl;   //4  4
    
    iv.push_back(3);//在最後插入元素 1
    cout<<"size="<<iv.size()<<"  "<<"capacity="<<iv.capacity()<<endl;   //5  8
    
    for(i=0;i<iv.size();++i)
        cout<<iv[i]<<" ";   //9 9 1 2 3 
    cout<<endl;
    
    iv.pop_back();//從最後刪除元素
    iv.pop_back();//從最後刪除元素
    cout<<"size="<<iv.size()<<"  "<<"capacity="<<iv.capacity()<<endl;   //3  8 申請的空間不會收回去
    for(i=0;i<iv.size();++i)
        cout<<iv[i]<<" ";   //9 9 1
    cout<<endl;
    
    vector<int>::iterator ivite =find(iv.begin(),iv.end(),1);//找到元素 1的位置 
    if(ivite != iv.end())
        iv.erase(ivite);  //刪除vector 中所有 值為1的元素
    cout<<"size="<<iv.size()<<"  "<<"capacity="<<iv.capacity()<<endl;   //2  8 申請的空間不會收回去
    for(i=0;i<iv.size();++i)
        cout<<iv[i]<<" ";   //9 9 
    cout<<endl;
    
    iv.push_back(5);
    iv.push_back(6);
    iv.push_back(7);
    iv.push_back(8);
    ivite =find(iv.begin(),iv.end(),6);//找到元素 6的位置 
     if(ivite != iv.end())
        iv.insert(ivite,3,7);  //在 元素6之前 插入 3個7
    
    for(i=0;i<iv.size();++i)
        cout<<iv[i]<<" ";   //9 9 5 7 7 7 6 7 
    cout<<endl;
    cout<<"size="<<iv.size()<<"  "<<"capacity="<<iv.capacity()<<endl;   //9  12
    
    iv.clear();//刪除所有元素
    cout<<"size="<<iv.size()<<"  "<<"capacity="<<iv.capacity()<<endl;   //0  12
    
    
    return 0;
}