vector是stl標準模板庫中的重要容器之一,可以通過設定來存放各種不同型別的資料,在stl中vector的實現方式是類模板,這些模板的引數允許我們指定容器中元素的資料型別,在結構上更加靈活,並且能夠避免重複編碼。
在工程中建立乙個vector物件,在vector上右鍵轉到定義,可以找到vector對應的實現**。
template>
class vector
: public _vector_alloc<_vec_base_types<_ty, _alloc> >
由於**非常多,所以在這裡只貼一小部分,能夠看出,vector實際上是乙個模板類,它通過類模板的形式來達到儲存不同種資料的實現。也可以將其看做是存放某種資料型別的動態陣列。
1.建立容器(構造物件)
//---無初值---
vectorv1; //表示存放int型的容器
vectorv1; //表示存放double型的容器
class color;
vectorvc1; //表示存放類color的容器
//---有初值---
vectorv1 = ; //v1的元素是1、2、3、4
vectorv2(5); //v2的元素個數為5,元素值都為0
vectorv3(5, 1); //v3的元素個數為5,元素值都為1
vectorv4(v1); //拷貝構造,v4=v1
vectorv5(v1.begin(), v1.end()); //v5的元素是從v1的首個元素到最後乙個元素
vectorv6(v1.begin(), v1.begin()+3);//v6的元素是v1的前3個元素
int ary = ;
vectorv7(ary, ary+3); //v7的元素是陣列ary中的前3個元素
注意:這裡的v1.begin()指向陣列首個元素,但v1.end()並不是指向最後元素,而是指向最後乙個元素的下乙個,有點類似於字串裡的 『\0』 。在執行vectorv4(v1.begin(), v1.end());
的拷貝操作中,拷貝區間是左閉右開的,在之後的類似操作中也都是左閉右開。
2.容器賦值
//---assign函式---
vectorv1 = ;
vectorv2;
v2.assign(); //v2被賦值為
v2.assign(v1.begin(), v1.end()); //v2被賦值為v1的首個元素到最後乙個元素
v2.assign(v1.begin(), v1.begin()+3); //v2被賦值為v1的首個元素到第3個元素
vector::iterator iter = v1.begin();
v2.assign(iter, iter+3); //利用迭代器,v2被賦值為v1的首個元素到第3個元素
//---直接賦值---
v2 = v1; //爽!
3.容器長度的查詢、設定和調整//---查詢長度---
vectorv1 = ;
int len = v1.size(); //得到v1的長度,即元素個數
intcaplen = v1.capacity(); //得到v1的容器大小
bool isempty = v1.empty(); //查詢容器是否為空,是則返回true
v1.size()表示當前v1內的元素個數,v1.capacity()表示當前容器所能容納的最大元素個數。當容器建立賦初值且未進行插入刪除時,這兩個值是相等的,但是進行向v1內新增元素的操作後,caplen就會大於len,這是因為初始化時分配的容器長度5已經不足以新增元素,所以要再開闢一塊新的更大的空間(例如長度8)將前5個複製進去,再把第6個元素賦值為想新增的值。此時元素個數為6,但容器個數為8。這樣做可以減少操作次數,節省資源。需要注意的是,當v1.capacity() > v1.size()時,不能通過v1[5]類似的方式直接呼叫或賦值給size()之外的值,多餘空間是push_back用的,對於我們來說,只可知不可用。
//---調整長度---
vectorv1 = ;
v1.resize(8); //v1的元素個數改為8個,大於原長度則補預設值0
v1.resize(3); //v1的元素個數改為3個,小於原長度則刪除後面2個
v1.resize(8, 88); //v1的元素個數改為8,大於原長度則補設定值88
v1.resize(3, 88); //v1的元素個數改為3,小於原長度則刪除後面2個
v1.reserve(15); //v1的元素個數仍為6個,但整體容器長度改為15個
注:resize()函式改變的容器元素個數,即v1.size();reserve函式改變的是容器大小,即v1.capacity()。
4.容器資料的增加、刪除、查詢和改動
1.資料新增
//---在末尾新增元素---
vectorv1 = ;
v1.push_back(6); //在末尾新增元素,值為6
//---在資料中間插入元素---
vectorv2 = ;
v1.insert(v1.begin() + 1, v2.begin(), v2.end());//在v1的第1個元素的前面插入v2
v1.insert(v1.begin() + 1, 5, 66); //在v1的第1個元素的前面插入5個66
v1.insert(v1.begin() + 1, 66); //在v1的第1個元素的前面插入66
v1.insert(v1.begin() + 1, ); //在v1的第1個元素的前面插入
//這裡本來還應該有乙個int && _val的方式,以後學完c++11的特性再來補充
2.資料刪除
//---刪除末尾元素---
vectorv1 = ;
v1.pop_back(); //刪除末尾元素5
//---刪除中間元素---
v1.erase(v1.begin()+1); //刪除第2個元素v1[1]
v1.erase(v1.begin()+1, v1.begin()+3); //刪除從第2個到第3個元素。注意!左開右閉!
//---刪除所有元素---
v1.clear(); //爽!
//注意,執行clear後,v1.capacity()的值不變!
3.資料的單獨查詢和改動
//---查詢容器內是否包含某一元素---
vectorv1 = ;
bool isfind = count(v1.begin(), v1.end(), 3);//在v1內查詢3是否存在,是則返回1
//---下標操作---
int num1 = v1[3];
v1[3] = 6;
//---at函式---
int num2 = v1.at(3);
v1.at(3) = 6;
//---首位介面---
int num3 = v1.front(); //v1的首元素
int num4 = v1.back(); //v1的末元素
v1.front() = 6; //v1的首元素更改為6
v1.back() = 6; //v1的末元素更改為6
4.資料的依次查詢或改動
//---通過迴圈---
vectorv1 = ;
for(int i = 0; i < v1.size(); i++)
//---通過迭代器---
vector::iterator iter = v1.begin();
for(; iter != v1.end(); iter++)
5.容器的其它操作//需要標頭檔案#include//---排序---
vectorv1 = ;
sort(v1.begin(), v1.end());//對容器v1內的資料進行排序,區間可選
//---反轉---
reverse(v1.begin(), v1.end());//對容器v1進行反轉,區間可選
//後面如果遇到再補充吧
其中,sort函式在我的其它文裡有介紹,在這裡不過多說明。以上就是我總結的內容,以後在學習過程中遇到新的東西會繼續更新,希望大家批評指正!
.我是沒訊號的法杖,無法傳送訊號,也無法接受訊號。
c STL標準模板庫 vector容器
vector是stl標準模板庫中的乙個容器,可以容納不同的資料型別,並且資料可以自動向前增長,因此稱之為向量,vector是乙個序列式容器,裡面的底層實現是乙個順序表結構 1.資料自動初始化為0 2.可以動態增長長度 相比與陣列強大太多,可以用vector取代陣列 3.支援隨機訪問資料 4.對記憶體...
C STL 標準模板庫
1.泛型程式設計 在c 中,模板是泛型程式設計的基礎。下面有乙個stl初體驗的 include include include include include include using namespace std 自定義函式物件 template class square int test int...
C STL標準模板庫
stl共有6中元件 容器 容器介面卡 迭代器 演算法 函式物件 仿函式 和函式介面卡。最常用的是順序容器,順序容器內的元素按其位置進行儲存和訪問。除順序容器外,標準庫還定義了幾種關聯容器。這裡我們主要講一下順序容器。標準庫定義了三種順序容器型別 vector list和deque,它們的差別在於訪問...