天天看點

【溫故而知新】C和C++6:STL中的vector容器

向量容器vector是STL中提供的最常用的容器之一,提供了随機通路數組的功能,可以實作對内部元素的随機通路以及友善地在末尾插入和删除資料。vector可以十分友善地實作資料結構中數組、堆棧功能,而且不需要手動編寫管理資料結構的相關函數。其定義在頭檔案<vector>中。

對vector中的元素進行指派:

向vector中存放資料主要有兩種方法,其一是使用push_back函數逐個在vector末尾添加資料;采用這種方法不需要對容器進行初始記憶體配置設定,可以直接從一個空的容器開始操作,但是隻能依次将元素加載容器的末尾,不是非常靈活。其二是先調用reserve函數預先設定容器大小,然後可以像普通的數組一樣分别對其各個元素進行指派。

擷取容器的大小:

在vector中,“尺寸”和“容量”是兩個不同的概念,分别用size()和capacity()函數擷取。修改這兩個值的方法分别為resize()和reverse()。無論如何修改容器,這兩個值總是存在限制關系,即vector的size值始終不大于capacity值。可以這麼認為,capacity所指的是容器的有效容量,而size所指的是容器的實際大小;并非所有的有效容積都被添加上了資料,而容器内所有資料所占據的空間必須屬于有效容量中(汗!好拗口……)。當容器的size擴大并超過了capacity時,capacity的值同時也會擴大到至少同size相同的大小。

判斷容器是否為空:

vector提供empty()方法,傳回布爾值,為空傳回true,非空傳回false。

使用疊代器循環周遊成員:

定義一個疊代器需要指定容器名和其中的資料類型。定義和使用方法如:

在大多數時候,可以采用for_each循環,指定一個範圍内的第一個和最後一個疊代器,以及函數的指針以友善地實作對容器對象的批量操作。具體可以參考http://msdn.microsoft.com/en-us/library/e5sk9w9k(v=vs.120).aspx。需要注意的是末尾iterator不包括在處理範圍内。

使用STL的算法:

使用算法必須包含定義算法的頭檔案:#include <algorithm>

1、count和count_if函數可以統計容器中某個元素的個數并作為傳回值。其中count_if的參數中有一個函數對象,可以使用更加靈活的方式判斷待統計元素滿足某個條件的判别準則。

2、find和find_if函數實作容器中某個元素的查找操作。同count一樣,find也需要指定開始和結尾的疊代器,并指定查找的目标元素,傳回值為一個指向該元素的疊代器。與count_if類似的,find_if也包含一個函數對象作為參數,可以更加細緻、個性化地指定查找目标的特性。

3、增加和删除元素:我們知道在vector的末尾增加元素可以使用push_back()友善地完成,除此之外還可以使用insert()函數在任意位置插入元素,隻是效率要遠低于push_back()。類似的是,可以使用pop_back()和erase()函數實作删除最後一個和任意一個元素。需要注意的是,如果在一個疊代器的循環中erase疊代器指向的元素,這個疊代器将不可再使用。

4、交換對象:vector中實作了swap函數用于兩個對象的交換。

繼續閱讀