最近仔细阅读了下侯捷老师的《STL源码剖析》的前三章内容:空间配置器、迭代器、traits技术,为了加强理解和掌握,特参照源码自实现Vector,以下对相关重点知识进行说明。
2. 空间配置器
空间配置器方面的内容在之前的博客已进行详细说明,查看->STL空间配置器解析和实现.
3. 内存基本处理工具
(1)对象构造
(2)Destroy()函数的泛化和特化版本实现,主要体现对象T是否包含trivial construct
(3)迭代器范围赋值
(4)迭代器范围拷贝
template<class T1, class T2> void Construct(T1* p, const T2& value) { new (p) T1(value); // placement new;调用T1::T1(value) } template<class T> void Destroy(T* p) { p->~T(); p = NULL; } template<class ForwardIterator> void Destroy(ForwardIterator first, ForwardIterator last) { ForwardIterator iter = first; while (iter != last) { typedef typename TRAITS_DEFINE::iterator_traits<ForwardIterator>::value_type T; cout << typeid(T).name(); T p = (T)*iter; Destroy(&p); iter++; } } template<class ForwardIterator> void Destroy(ForwardIterator first, ForwardIterator last, TRAITS_DEFINE::__true_type) { ; } template<class ForwardIterator> void Destroy(ForwardIterator first, ForwardIterator last, TRAITS_DEFINE::__false_type) { for (; first<last; first++) { Destroy(&*first) } } template<class ForwardIterator, class T> void Destroy(ForwardIterator first, ForwardIterator last, T*) { typedef typename TRAITS_DEFINE::__type_traits<T>::has_trivial_destructor trivial_destructor; Destroy(first, last, trivial_destructor()); } template<class OutputIterator> OutputIterator uninitialized_fill_n_ex(OutputIterator iter, const size_type& nSize, const T& nValue) { for (size_t i = 0; i < nSize; i++) { *iter++ = nValue; } return iter; } void Fill_Initialize(const size_type& nSize, const T& nValue) { Iterator iter = data_allocator::Allocate(nSize); uninitialized_fill_n_ex(iter, nSize, nValue); Start = iter; Finish = Start + nSize; EndOfStorage = Finish; } template<class InputIterator, class OutputIterator> OutputIterator uninitialzed_copy_ex(InputIterator first, InputIterator last, OutputIterator dest) { for (; first != last; first++,dest++) { *dest = *first; } return dest; }