前記:本周進(jìn)入了STL與泛型編程。STL幾乎可以當(dāng)作一個新的語言來學(xué),運用上與前面的c++知識在語法、觀念上有很多不同悄晃。但是要真正領(lǐng)悟泛型編程的精髓,還是要深入stl源碼中深入學(xué)習(xí)凿滤、理解妈橄。C++語法知識是基礎(chǔ),泛型編程思想是武器翁脆。課程開始從類模版和函數(shù)模版眷蚓,操作符重載入手。然后引申到泛型編程思想反番,講了特性(Traits)沙热,迭代器等的概念。開始介紹泛型編程中很重要的容器(containers)中的vector和list恬口。以下是本周我學(xué)習(xí)中得出的一些tips校读。
STL標(biāo)準(zhǔn)模版庫
顧名思義沼侣,STL是一個倉庫祖能,龐大的工具集合。它由若干精心勾畫的組件合作構(gòu)筑蛾洛,其中比較核心的是:容器(Containers)养铸,迭代器(Iterators),算法(algorithms)轧膘。
STL的基本觀念是將數(shù)據(jù)和操作分離钞螟。數(shù)據(jù)由容器進(jìn)行管理,操作則由可定制的算法進(jìn)行定義谎碍。迭代器在兩者之間充當(dāng)粘合劑鳞滨,這樣就可以將各種思想和各種容器交互運作。[[1]]
迭代器
迭代器(Iterator)是一個可遍歷STL容器中元素的對象蟆淀。首先它是一個對象拯啦,要遍歷容器中的元素澡匪,必須契合該容器的數(shù)據(jù)結(jié)構(gòu),所以說每一種容器都有自己的迭代器褒链。他們定義一致的接口(使用typedef 關(guān)鍵字唁情,在分析源碼是這個關(guān)鍵字很關(guān)鍵),以便使各種算法能夠通過接口使用他們(或者被他們使用)甫匹。
1,比較重要的接口如下:
begin():返回一個迭代器甸鸟,指向容器起始點,一般指第一個元素(如果有)兵迅。
end():返回一個迭代器抢韭,指向容器的結(jié)束點,一般在最后個元素的后一位喷兼。
所以begin()到end()的區(qū)間是一個半開區(qū)間篮绰,像[begin(),end())。
2,另一個要注意的是季惯,任何容器都定義有兩種迭代器型別:
container::iterator 可讀/寫的迭代器吠各。該類型的迭代器可以對容器內(nèi)容進(jìn)行讀寫操作
container::const_iterator 只可讀的迭代器。該類型的迭代器只可以對容器內(nèi)容進(jìn)行讀訪問勉抓〖致可以聯(lián)想const關(guān)鍵字。
vector(矢量)
vector很像是一個動態(tài)數(shù)組藕筋,可以隨時更改容量大小纵散。內(nèi)部元素總是存在某種順序,可以稱為有序集群(ordered collection)隐圾。
要使用vector伍掀,必須包含頭文件vector,和訪問名稱空間std暇藏。
其聲明是:
namespace std {
template <class T, class Allocator=alloctor<T> >
class vector;
}
需要注意的是蜜笤,雖然vector可以增加、刪減容量盐碱。但是重新配置容量很耗時間把兔,而頻繁的配置內(nèi)存十分不可取。并且一旦你內(nèi)存重新配置瓮顽,vector相關(guān)的reference县好、pointers、iterators都會變化暖混,甚至失效缕贡。所以保留一定的容量對使用vector很有好處。
使用reserve()函數(shù)可以保留適當(dāng)容量,但是它不能縮減容量晾咪。當(dāng)你調(diào)用reserve()縮減容量黔漂,將不引起任何反應(yīng)。
1【引用自《C++標(biāo)準(zhǔn)庫》P74】