STL原始碼學習 vector使用方法總結

2021-06-25 07:48:28 字數 3909 閱讀 3201

一、容器vector

使用vector必須包含標頭檔案:

#include

型別vector是乙個定義於namespace std內的template:

[cpp]view plain

copy

print?

template

class _ax = allocator<_ty> >  

第二個引數定義記憶體模型。我們一般採用預設的記憶體模型。

二、vector的功能

vector模塑出乙個動態陣列。vector將其元複製到內部的動態陣列中。元素之間總是存在某種順序,它是一種有序群集。支援隨即訪問。它的迭代器是隨機訪問迭代器,所以對任何乙個stl演算法都奏效。

向vector新增乙個元素或者刪除其中的乙個元素,其後的所有元素都要移動位置,每一次移動都要呼叫賦值操作符。所以,在末端新增或刪除元素,效能很好。但是在前段或者中部的話,效能較差。

vector優異效能的秘訣之一是它配置比其所容納的元素所需更多的記憶體。我們需要了解大小容量的關係。

函式size()可以返回vector的大小,即vector中實際元素的個數。

而capacity()返回容量,是當前的vector所實際能夠容納的元素的數量。它應該總是大於或者等於vector的大小。如果需要向vector中放置比capacity更多的元素,則需要重新配置內部儲存器。vector的容量也會隨之增長。看下面的示例**:

[cpp]view plain

copy

print?

#include 

#include 

#include 

#include 

using

namespace std;  

int main()    

執行結果:

在程式中,當再次向vector插入元素時,由於vector的容量不夠,所以引起了記憶體的重新分配。但是capacity()的結果與實作版本有關,max_size也是。

vector的容量十分重要,是因為:

1、一旦記憶體重新配置,與之相關的所有的reference、pointers、iterators都會失效。

2、記憶體配置很費時。

解決這個問題的方法有:

1、可以使用reserve()保留適當容量,減少重新配置記憶體的次數。示例**:

[cpp]view plain

copy

print?

vectorsentence(1);  

sentence.reserve(50);  

2、在初始化期間向建構函式傳遞附加引數,構造出足夠的空間。

[cpp]view plain

copy

print?

vectorv(5);  

當然,這種元素的型別必須提供預設建構函式。但是如果元素的型別比較複雜,初始化操作也很耗時。如果只是為了保留足夠的記憶體,使用方法1較好。

注意:reserve不能縮減vector的容量。由此,我們可以知道,即使刪除元素,其reference、pointers、iterators也會繼續有效,指向動作發生前的位置。

但是插入操作可能使reference、pointers、iterators失效(因為可能會導致重新配置空間)。

使用swap函式可以縮減vector容量。因為兩個vector交換內容後,他們的容量也會互換。

1、[cpp]view plain

copy

print?

template

void shrinkcapacity(vector&v)    

2、[cpp]view plain

copy

print?

vector(v).swap(v);  

上面兩種方法等價。

都是先構造出乙個臨時vector物件,以v的元素進行初始化,再與v進行交換。需要注意的是:臨時物件一般都是精確分配實際所需的記憶體。所以能夠起到減小vector容量的效果。

三、vector的操作函式

所有的建構函式和析構函式如下:

非變動性操作:

賦值操作:

上述操作進行的是將新元素賦值給vector,並將舊元素全部移除!示例**:

[cpp]view plain

copy

print?

#include 

#include 

#include 

#include 

using

namespace std;  

int main()    

執行結果:

可以看出原來的元素全部被刪除了。

元素訪問

在這幾個函式中,唯一進行下標檢查的是at函式。

因此,在呼叫operator的時候,必須心理清楚索引是否是有效的。

迭代器相關函式

迭代器失效的兩種情況是:

1、在乙個較小的位置上刪除或者是移動元素。

2、由於容量的變換引起記憶體重新分配。

插入和移除元素

插入和移除元素,都會使「作用點」之後的各元素的reference、pointers、iterators失效。插入操作還可能引發記憶體重新分配,那麼該容器上的所有的reference、pointers、iterators都會失效。

四、把vector當做一般陣列使用

現在的c++標準保證vector的元素必須分布於連續空間中。對於vector中的乙個合法索引,滿足下列表示式:

&v[i] = &v[0] + i;

我們必須保證vector能夠容納所有資料。如果使用的是c-string,記住最後有個'\0'。

只要我們需要乙個元素型別為t的陣列,就可以採用vector,然後傳遞第乙個元素的位址給它。

[cpp]view plain

copy

print?

printf("%s",v.begin());//error(might work,but not portable)

printf("%s",&v[0]);//ok

STL原始碼分析之Vector

地球人都知道vector的查詢效率很高,插入和刪除的效率低下,容器會隨著元素的不斷增加自動增長,最近在看了stl原始碼之後,發現確實是這樣,下面是vector一些關鍵的函式.從這些函式可以看出插入和刪除的過程,以及容器自動增長的方式.兩個通過下標獲取元素的函式.reference operator ...

STL原始碼剖析之vector

向量vector 1.vector概述 vector的資料安排以及操作方式,與array非常相似。兩者的唯一差別在於空間的運用的靈活性。array是靜態空間,一旦配置了就不能改變 vector是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新元素。vector的實現技術,關鍵在於其對大小...

STL原始碼剖析 一 vector

開始學習 stl原始碼剖析 已經學習了前兩章 有關記憶體管理 以及 迭代器 下面 先嘗試自己寫vector再根據源 進行 修改 以下為 ifndef vector h define vector h include alloc.h define vector overflow std cerr ve...