C++ STL与泛型编程-第二篇 (Boolan)
本章内容:
1 OOP(面向对象编程) vs. GP(泛型编程)
2 模板(泛化,全特化,偏特化)
3 分配器
4 容器之间实现关系与分类
5 深度探索list
6 迭代器的设计原理和interator traits的作用与设计
1 OOP(面向对象编程) vs. GP(泛型编程)
-
OOP企图将datas和methods关联在一起。
list不能使用全局的::sort()
进行排序,因为全局sort()
中用到了RandomAccessIterator
,而list没有该迭代器,只有当有RandomAccessIterator
时才能进行全局的排序操作。 -
GP却是将datas和methods分开来。
Data Structures(Containers)
template<class T, class Alloc=alloc>
class vector{
……
};
template<class T, class Alloc=alloc, size_t BufSiz=0>
class deque{
……
};
Alogrithms
template<typename _RandomAccessIterator>
inline void
sort(_RandomAccessIterator __first,
_RandomAccessIterator __last)
{
……
}template<typename _RandomAccessIterator, typename _Compare> inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { …… }
-
采用GP:
(1).Containers
和Algorithms
团队可各自闭门造车,其间以iterator
贯通即可。
(2).Algorithms
和Iterators
确定操作范围,并通过Iterators
取用Container
元素。 -
结构说明图如下所示:
GP采用结构 -
代码示例如下所示:
GP示例程序
2 模板(泛化,全特化,偏特化)
-
Class Templates
类模板:
template<typename T>
class complex
{
public:
Complex(T r = 0, T i = 0):re(r), im(i) { }
T real() const { return re; }
T imag() const { return im; }
private:
T re, im;
friend Complex& __doapl(complex*, const complex&);
}; -
模板类使用
{ complex<double> c1(2.5, 1.5); complex<int> c2(2, 6); }
-
Function Templates
函数模板stone r1(2, 3), r2(3, 3), r3; r3 = min(r1, r2);
-
编译器对
function template
进行实参推导(argument deduction
)template<class T> inline const T& min(const T& a, const T& b) { return b < a ? b : a; }
-
实参推导的结果,T为
stone
,于是调用stone::operator<()
class stone { public: stone(int w, int h, int we):_w(w), _h(h), _weight(we) { } bool operator<(const stone& rhs) const { return _weight < ths._weight; } private: int _w, _h, _weight; };
-
Member Templates
,成员模板template<class T1, class T2> struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T1 second; pair() : first(T1()), second(T2()) { } pair(const T1& a, const T2& b) : first(a), second(b) { } #ifdef __STL_MEMBER_TEMPLATES template<class U1, class U2> pair(const pair<U1, U2>& p) : first(p.first), second(p.second) { } #endif };
-
generalization
,泛化struct __true_type { }; struct __false_type { }; template<class type> struct __type_trait { typedef __true_type this_dummy_number_must_be_first; typedef __false_type has_trivial_default_constructor; typedef __false_type has_trivial_copy_constructor; typedef __false_type has_trivial_assignment_operator; typedef __false_type has_trivial_destructor; typedef __false_type is_POD_type; };
-
Specialization
,特化template<> struct __type_trait<int> { typedef __false_type has_trivial_default_constructor; typedef __false_type has_trivial_copy_constructor; typedef __false_type has_trivial_assignment_operator; typedef __false_type has_trivial_destructor; typedef __false_type is_POD_type; }; template<> struct __type_trait<double> { typedef __false_type has_trivial_default_constructor; typedef __false_type has_trivial_copy_constructor; typedef __false_type has_trivial_assignment_operator; typedef __false_type has_trivial_destructor; typedef __false_type is_POD_type; };
-
偏特化代码示例Partial Specialization
,偏特化
3 分配器
- 分配器
allocator
在vc6.0下的实现如下所示:
allocator实现
- 分配器
-
VC6.0
的allocator
只是以::operator new
和::operator delete
完成allocate()
和deallocate
,没有任何特殊的设计。 -
其中
int *p = allocator<int>().allocate(512, (int*)0); allocator<int>().deallocate(p, 512);
表示利用allocate
分配得到了一个指针p
存放了512个int
,利用deallocate
归返了指针p
。allocator<int>()
表示产生了一个临时对象。 - 分配器
allocator
在Borland C++
下的实现如下所示:
allocator实现
- 分配器
-
Borland C++
的allocator
只是以::operator new
和::operator delete
完成allocate()
和deallocate
,没有任何特殊的设计。 - 分配器
allocator
在G2.9
下的实现如下所示:
allocator实现
注意:右边的注解说明G2.9中没有使用该分配器,而是使用了SGI的STL分配器。
- 分配器
-
allocator使用G2.9 STL
对allocator
的使用如下图所示:
-
其中使用的分配器名字为
alloc
,而不是像其他库中使用了allocator
。 -
alloc实现G2.9
的alloc
实现如下:
4 容器之间实现关系与分类
-
本图以缩排形式表达“基层与衍生层”的关系。这里的衍生层并非继承(inheritance)而是复合(composition)。
容器结构分类图 -
容器及其迭代器的sizeof()大小
容器和迭代器大小
5 深度探索list
- 容器
list
的结构和实现如下图所示:
结构和实现代码 -
list
的迭代器interator
实现如下:
iterator实现 -
iterator++
和++iterator
的实现说明:
iterator++和++iterator
6 迭代器的设计原则和interator traits的作用与设计
-
iterator
需要遵循的原则
iterator原则 - 其中
traits
需要的五个accociated types
,如下所示:
associate types -
iterator Traits
用以分离class iterators
和non-class iterators
Iterator Traits
- 完整的
iterator_traits
iterator_traits
网友评论