該函式用於判斷兩個指定區間內的資料是否相等,若第二個區間較長,則多處部分不予考慮,因此,若要保證兩個序列相等則應先判斷其元素個數是否相同。其實現較簡單,沒有過多好說的。
fill函式使用指定值填充目標區間,其填充過程是通過呼叫賦值運算子來進行的,fill_n與fill類似,只是其填充的是區間的前n個元素。
uninitialized_fill假設目的區間是未井過初始化的,它會先資料是否未pod型別,若是則直接呼叫fill函式進行填充,否則呼叫複製建構函式在目的區間進行構造,因此若目的區間已初始化則會造成建構函式與析構函式的呼叫次數不匹配。而fill如上所說呼叫的是賦值運算子,因此若操作的區間未經初始化且是非pod;型別資料,則會對未構造物件呼叫賦值運算子,造成未定義的行為。
該函式交換兩個迭代器所指的物件,而非迭代器所指的位置
template inline void __iter_swap(_forwarditer1 __a, _forwarditer2 __b, _tp*)
template inline void iter_swap(_forwarditer1 __a, _forwarditer2 __b)
該函式以字典序來比較兩個序列的元素,當序列1小於序列2時(某個元素小於或長度小於)則返回true,否則返回false。用使用者也可以自定義比較方式,而不使用預設的小於操作符。對於c字串(unsigned char*)型別過載了乙個函式,通過呼叫memcmp來進行比較。
template bool lexicographical_compare(_inputiter1 __first1, _inputiter1 __last1,
_inputiter2 __first2, _inputiter2 __last2)
// 序列1已到末尾,而序列2還未到,即序列1的長度小於序列2的長度
return __first1 == __last1 && __first2 != __last2;
}inline bool
lexicographical_compare(const unsigned char* __first1,
const unsigned char* __last1,
const unsigned char* __first2,
const unsigned char* __last2)
平行的比較兩個序列 [first1, last1),[first2, first2 + last1 - first1) ,返回指向第乙個不相等位置的迭代器對(分別指向序列1和序列2,當序列2的長度小於序列1時,會出現為定義行為,因為序列2的長度是根據序列1算的。若相等則都返回last迭代器
copy函式為了提高拷貝效率而採用了過載,萃取,偏特化的程式設計技巧,可謂是無所不用其極。
實現了接收基礎型別指標的函式過載,直接呼叫memmove來拷貝記憶體,效率高。且其實現方式十分巧妙
#define __sgi_stl_declare_copy_trivial(_tp) \
inline _tp* copy(const _tp* __first, const _tp* __last, _tp* __result)
__sgi_stl_declare_copy_trivial(char) // 這樣可以免於重新寫函式體
__sgi_stl_declare_copy_trivial(signed char)
__sgi_stl_declare_copy_trivial(unsigned char)
__sgi_stl_declare_copy_trivial(short)
__sgi_stl_declare_copy_trivial(unsigned short)
__sgi_stl_declare_copy_trivial(int)
__sgi_stl_declare_copy_trivial(unsigned int)
__sgi_stl_declare_copy_trivial(long)
__sgi_stl_declare_copy_trivial(unsigned long)
#ifdef __stl_has_wchar_t
__sgi_stl_declare_copy_trivial(wchar_t)
#endif
#ifdef _stl_long_long
__sgi_stl_declare_copy_trivial(long long)
__sgi_stl_declare_copy_trivial(unsigned long long)
#endif
__sgi_stl_declare_copy_trivial(float)
__sgi_stl_declare_copy_trivial(double)
__sgi_stl_declare_copy_trivial(long double)
#undef __sgi_stl_declare_copy_trivial
在copy呼叫中會通過萃取來在編譯期得知物件是否只有預設的賦值運算子,若是則萃取或得型別struct __true_type{};否則為struct __false_type{};接著通過其在編譯期選擇呼叫哪個函式,若使用的是原始指標,且元素只有預設賦值運算子,則會直接使用memmove進行拷貝,否則根據迭代器型別選擇相應函式(見下一小節),。**如下:
template inline _outputiter copy(_inputiter __first, _inputiter __last,
_outputiter __result)
// 對於只包含預設賦值運算的型別,呼叫該函式,轉而呼叫memmove函式進行拷貝
// 使用偏特化匹配原始指標,因為對於有的結構不能用memmove,比如deque
template struct __copy_dispatch<_tp*, _tp*, __true_type>
};template inline _tp* __copy_trivial(const _tp* __first, const _tp* __last, _tp* __result)
【注】:只有以原始指標為引數呼叫copy,且所指型別是由預設賦值運算子才可以呼叫memmove。
對於過載了賦值運算子的型別和不是用原始指標呼叫copy時,會轉而呼叫非偏特化的函式,從而逐元素的呼叫賦值運算子進行拷貝,**如下:
template struct __copy_dispatch
};
再判斷迭代器型別,從而選擇最快的方式進行遍歷,對於隨機迭代器呼叫以下**:
template inline _outputiter
__copy(_randomaccessiter __first, _randomaccessiter __last,
_outputiter __result, random_access_iterator_tag, _distance*)
return __result;
}
而其它迭代器呼叫以下**:
template inline _outputiter __copy(_inputiter __first, _inputiter __last,
_outputiter __result,
input_iterator_tag, _distance*)
STL基本演算法
equal 判斷兩個區間是否相等 fill 改填元素值 fill n 改填元素值,n次 iter swap 元素互換 lexigicographical compare 以字典順序進行比較 max 最大值 min 最小值 mismatch 找出不匹配點 swap 交換元素 set union 並集 ...
演算法入門基礎 STL基本介紹
stl standard template library 即標準模板庫,是乙個具有工業強度的,高效的c 程式庫。它被容納於c 標準程式庫 c standard library 中,是ansi iso c 標準中最新的也是極具革命性的一部分。該庫包含了諸多在電腦科學領域裡所常用的基本資料結構和基本演...
基本STL操作
map是一種鍵值對容器。特點 鍵唯一且基本資料型別按從小到大公升序排列。使用方法如下 include 輸入輸出標頭檔案 include map標頭檔案 using namespace std 命名空間 map m 宣告乙個名為m的map int main count方式判斷元素是否存在 if m.c...