關於iterator traits和type traits的使用,我們什麼時候會使用這兩個類?我們怎麼使用?
//問題:將[first1,last1)區間內的元素複製一遍。
//我們需要知道first1迭代器的型別。。
template_iter copy(_iter first1,_iter last1)
else __normal_copy(__p,__first);
//方法二:
//mfc中的策略
//方法三:利用函式的過載機制和模板推斷機制
__copy(_iter(__p),__first,_copy_traits());
} return _iter(__result);
}templatevoid __copy(_iter __dest,_iter __source,__true_type)
templatevoid __copy(_iter __dest,_iter __source,__false_type)
這就是traits使用的大體情況,這裡stl中使用的統一技術就是函式過載與模板推斷機制
舉兩個stl中的例子:他們遵循的模式都是:定義介面--利用模板推斷和過載將任務分配或者說是路由-----特化特定的型別提高速度
//兩個例子:
template inline void destroy(_tp* __pointer)
//補充__value_type
template inline typename iterator_traits<_iter>::value_type*
__value_type(const _iter&)
template inline typename iterator_traits<_iter>::value_type*
value_type(const _iter& __i)
#define __value_type(__i) value_type(__i)
//銷毀物件,下面使用的策略是、其實完全不必要,只是為了在stl中使用一致的策略
template inline void _destroy(_forwarditerator __first, _forwarditerator __last)
template inline void
__destroy(_forwarditerator __first, _forwarditerator __last, _tp*)//我們需要型別資訊
template void
__destroy_aux(_forwarditerator __first, _forwarditerator __last, __false_type)
template inline void __destroy_aux(_forwarditerator, _forwarditerator, __true_type) {}
//特化
inline void _destroy(char*, char*) {}
inline void _destroy(int*, int*) {}
inline void _destroy(long*, long*) {}
inline void _destroy(float*, float*) {}
inline void _destroy(double*, double*) {}
//copy:
template inline _forwarditer uninitialized_copy(_inputiter __first, _inputiter __last, _forwarditer __result)
template inline _forwarditer __uninitialized_copy(_inputiter __first, _inputiter __last, _forwarditer __result, _tp*)
template inline _forwarditer __uninitialized_copy_aux(_inputiter __first, _inputiter __last,_forwarditer __result,__true_type)
template _forwarditer __uninitialized_copy_aux(_inputiter __first, _inputiter __last, _forwarditer __result, __false_type)
__stl_unwind(_destroy(__result, __cur));
}//對於char和wchar_t的特化版本
inline char* uninitialized_copy(const char* __first, const char* __last,
char* __result)
inline wchar_t*
uninitialized_copy(const wchar_t* __first, const wchar_t* __last,
wchar_t* __result)
STL原始碼分析 traits
traits 譯作萃取 是c 中一種特殊的程式設計技法,它是模板元程式設計最直接的用例之一。通過traits,可以抽取模板入參型別的各種屬性。接下來我們通過stl中最常見的幾種traits舉例說明。type traits用於判斷型別是否為trival 譯作平凡 如果乙個型別是trivial的,則可以...
《STL原始碼剖析》traits技法分析
在完成乙個迭代器的時候,我們可能會暴露太多的細節在外面,為了將這些細節給隱藏,我們需要封裝,這也是為什麼每一種stl容器都提供了一種專屬的迭代器。為了解決以 迭代器所指物件的型別 為型別 解決辦法是 利用template的引數推導 argument deducation template void ...
STL 原始碼閱讀
1 這裡可以看出來,容器將迭代器作為類成員。vectora iteratorite a.begin 容器的成員函式可以返回迭代器,所以迭代器是容器的成員物件。2 個人理解,迭代器是對指標的封裝和提公升,盡可能遮蔽資料結構的底層細節,對外提供統一的操作介面,這些介面跟普通指標的功能類似,比如自增或自減...