C STL標準模板庫之容器vector

2021-10-07 18:27:29 字數 4335 閱讀 1005

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,它們的差別在於訪問...