向量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不變,內部緩衝區不重新申請