STL定義有五個全局函數,作用于未初始化空間上,這樣的功能對于容器的實作很有幫助。前兩個函數是用于構造的construct()和用于析構的destroy(),另三個函數是uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n,分别對應于高層次函數copy()、fill()、fill_n()——這些都是STL算法。
1 uninitialized_copy
template <class InputIterator,class ForwardIterator>
ForwardIterator uninitialized_copy(InputIterator first,InputIterator last,ForwardIterator result);
uninitialized_copy()使我們能夠将記憶體的配置和對象的構造行為分離開來,如果作為輸出目的地的[result,result+(last-first))範圍内的每一個疊代器都指向為初始化區域,則uninitialized_copy()會使用copy constructor,給身為輸入來源之[first,last)範圍内的每一個對象産生一份複制品,放進輸出範圍中。換句話說,針對輸入範圍内的每一個疊代器i,該函數會調用construct(&*(result+(i-first)),*i),産生*i的複制品,放置于輸出範圍的相對位置上。
如果你需要實作一個容器,uninitialized_copy()這樣的函數會為你帶來很大的幫助,因為容器的全區間構造函數通常以兩個步驟完成:
配置記憶體塊,足以包含範圍内的所有元素
使用uninitialized_copy(),在該記憶體區塊上構造元素。
C++标志規格書要求uninitialized_copy()具有“commit or rollback”語意,意思是要麼“構造出所有必要的元素”,要麼(當有任何一個copy constructor失敗時)“不構造任何東西。
2 uninitialized_fill
template <class ForwardIterator,class T>
ForwardIterator uninitialized_fill(ForwardIterator first,ForwardIterator last,const T& x);
uninitialized_fill()也能夠使我們将記憶體配置與對象的構造行為分離開來。如果[first,last)範圍内的每個疊代器都指向未初始化的記憶體,那麼uninitialized_fill()會在該範圍内産生x(上式第三個參數)的複制品。換句話說,uninitialized_fill()會針對操作範圍内的每個疊代器i,調用construct(&*i,x),在i所指之處産生x的複制品。
與uninitialized_copy()一樣,uninitialized_fill()必須具備“commit or rollback”語意,換句話說,它要麼産生出所有必要元素,要麼不産生任何元素,如果有任何一個copy constructor丢出異常(exception),uninitialized_fill(),必須能夠将已産生的所有元素析構掉。
3 uninitialized_fill_n
template <class ForwardIterator,class Size,class T>
ForwardIterator uninitialized_fill_n(ForwardIterator first,Size n,const T& x);
uninitialized_fill_n()能使我們将記憶體配置與對象構造行為分離開來,它會為指定範圍内的所有元素設定相同的初值。
如果[first,first+n)範圍内的每一個疊代器都指向未初始化的記憶體,那麼uninitialized_fill_n()會調用 copy constructor,在該範圍内産生x(上式第三個參數——的複制品。也就是說,面對[first,first+n)範圍内的每個疊代器i,uninitialized_fill_n()會調用construct(&*i,x),在對應位置産生x的複制品。
uninitialized_fill_n()也具有“commit or rollback”語意:要麼産生所有必要的元素,否則就不産生任何元素。如果任何一個copy constructor丢出異常(exception),uninitialized_fill_n()必須析構已産生的所有元素。
以下分别介紹這三個函數的實作法,其中所呈現的iterators(疊代器)、value_type()、_type_traits、_true_type、_false_type、is_POD_type等實作技術,都在後面介紹。