1. 程式人生 > >[C++標準模板庫:自修教程與參考手冊]關於vector

[C++標準模板庫:自修教程與參考手冊]關於vector

什麼是vector

可以這樣認為,vector就是一個動態的陣列,其中的元素必須具備assignable(可賦值)和copyable(可拷貝)兩個性質。
這裡寫圖片描述

vector的一些重要的性質

  1. vector支援隨機存取,存取時間為O(1)。
  2. vector的迭代器是隨機存取迭代器,所以所有的STL演算法都可以使用。
  3. 在末尾新增元素時,vector的效能非常好(只要總的元素個數沒超過capacity就行)。但是如果在中間或者前面插入元素,那麼效能就不是那麼好了,此元素的後面全部元素都要後移,即每一次移動都要執行assign賦值操作。
  4. 兩個vector交換內容後,它們的容量也會交換。
  5. vector的第一個元素的索引為0,最後一個元素的索引為size()-1。
  6. 一個vector vec,它的一些操作:vec[x],vec.front(),vec.back()三個操作都不會檢查元素是否存在,所以要我們自己進行判斷該位置的元素存在與否。

vector的記憶體分配

vector的size表示當前擁有元素的個數,capacity表示vector最多能擁有多少個元素。如果size的大小超過了capacity,那麼vector就會重新呼叫記憶體分配器分配新的記憶體。
vector的容量之所以有很大的重要性,是因為兩個原因:

  1. 一旦記憶體重新分配,那麼這個vetor的迭代器,引用,指標全都會失效。
  2. 記憶體重新分配非常耗費時間。

當然,也可以使用reserve()函式來儲存適當的容量,避免不必要的記憶體配置:

std::vector<int> v;
//提前分配好100的容量
v.reserve(100);

當然,如果reserve()的引數中的數值比當前的capacity要小的話,那麼不會有任何反應。

vector一些常用函式

std::vector<int> c;
//返回idx位置所在的元素,如果月結,就會跑出out_of_range異常
c.at(idx);
//返回索引idx所在的元素,不進行範圍檢查
c[idx];
//返回第一個元素。不檢查第一個元素是否存在
c.front();
//返回最後一個元素,不檢查最後一個元素是否存在
c.back();
//返回一個隨機存取迭代器,指向第一個元素
c.begin(); //返回一個隨機存取迭代器,指向最後一個元素 c.end(); //返回一個逆向迭代器,指向逆向迭代的第一元素 c.rbegin(); //返回一個逆向迭代器,指向逆向迭代的最後元素的下一個位置 c.rend(); //在pos位置上插入一個elem副本,並返回新元素的位置 c.insert(pos,elem); //在pos位置上插入n個elem副本,無返回值。 c.insert(pos,n,elem); //在pos位置上插入區間[beg:end]內所有元素的副本,無返回值 c.insert(pos,beg,end); //在尾部新增一個elem副本 c.push_back(); //移除最後一個元素,但是不傳回 c.pop_back(); //移除pos位置上的元素,返回下一個元素的位置 c.erase(pos); //移除[beg,end]區間內的所有元素,返回下一元素的位置 c.erase(beg,end); //將元素數量改為num,如果size()變大了,多出來的新元素都用預設建構函式完成 c.resize(num); //將元素熟練改為num,如果size()變大了,多出來的新元素都是elem的副本 c.resize(num,elem); //移除所有的元素,將容器清空 c.clear();