1. 程式人生 > >向量vector 中主要函式的使用

向量vector 中主要函式的使用

一、vector用於實現陣列的功能,相當於在陣列的基礎上封裝了一些常用的功能。

 

vector的主要函式
函式名稱 功能
push_back 在尾部新增一個元素
pop_back 在尾部刪除一個元素
clear 清空所有元素
at 按索引訪問某個位置的元素
front 返回頭元素
back 返回尾元素
size 返回元素的個數
capacity 返回房前容量
risize 改變容量的大小
insert 在中間插入元素
erase 刪除中間元素

vector和普通的陣列一樣。具有容量的概念,可以推斷,vector內部是有一個緩衝區來儲存元素的,類似於下面的程式碼

template<typename T>
class vector
{
   private:
      T* m_buffer;     //緩衝區
      int m_capacity;  //緩衝區的大小
};

  可見,vector內容上還是陣列,只是外在形式上比較單純的陣列更易於使用了,它對外封裝了前面所列的介面函式,使讀者非常方便的操縱陣列

  在建立vector物件時,可以顯示的指定其初始大小,例如,以下的程式碼將初始容量設定位128,這意味著其內部建立了一個可以容納128個元素的緩衝區

vector<int> arr(128);
int capacity = arr.capacity(); //容量:128
int size = arr.size(); // 大小:128,已經包含了128個元素,並且此時的128個元素都為0
//在這種情況下,size和capacity相等

二、用at函式訪問陣列中的元素

vector<int> arr(128);
for(int i=0; i<arr.capacity(); i++)
{
    int& p = arr.at(i);
    p = 0;  //全部初始化為0
}

看起來很簡單,直接用at函式可以得到元素的引用(左值),然後直接操作這個引用即可。實際上vector還過載了操作符[ ],因此以下的程式碼是等價的

int &p = arr.at(0);
int &p = arr[0];

使用操作符 [ ],會顯得更簡潔一些,但是值得強調的是,如同陣列一樣,要注意越界問題,無論是at還是[ ] ,傳入的索引值都要在正確的範圍之內(0 <= index <= capacity - 1)。

注意上述的arr不是陣列,而是類

三、vector的一個顯著的特點是,其容量可以動態調整的,使用push_back可以在尾部追加一個元素,使用pop_back刪除 尾部元素

  例如:

vector<int> arr; //capacity:0, size:0
arr.push_back(1); //capacity:4,size:1

當建立物件時如果沒有指定capacity,則預設為0,此時capacity和size都是0(此時的緩衝區也是沒有建立的),當使用push_back在末尾新增一個元素時:

   (1)如果還有空間可用(size < capacity),則size加1,capacity不變

  (2)如果空間已滿(size = capacity),則重新申請一個較大的緩衝區,再把原有的拷貝到新緩衝區,再把新元素追加在後面。此時size加1,capacity為新的緩衝區的容量(一般新容量是原有的capacity+4,也有可能是每增加一個元素,capacity也增加1,具體取決於STL的庫實現)。

由此可見,push_back並不是節省cpu的操作,它是反覆地申請新緩衝區和拷貝大段資料,所以,在使用vector時候,應該預先估計一下,程式執行時可能需要的最大容量,並在初始化的時候指定其capacity引數,如果在迫不得已的情況下一定要調整容量的話,可以使用resize函式,儘量一步調整到位,不要多次反覆的使用resize

四、clear函式用於清空元素,size歸0,而capacity不變,內部緩衝區不重新申請