Boolan C++ STL与泛型编程_2

2017-06-01  本文已影响0人  竹林柳岸
主要内容:

本节主要讲解了面向对象和泛型编程的区别,以及source code所涉及到的基础知识(包括运算符重载、各种模板等),还有利用源码深入剖析了分配器、容器(list, vector, array, forward_list等)、迭代器。

源码之前,了无密码。

1.源码所在目录

2. oop(面向对象)与gp(泛型编程)

3. 技术基础--运算符重载、模板

四个运算符不能重载: :: , . , .*, :?
类模板、函数模板、成员模板
类模板中又分为泛化、特化、偏特化(局部特化,个数和范围上)

template <typename T> struct __type_traits {...}  // 泛化
template<> struct __type_traits<int> {...}        // 特化

template <class Iterator> struct iterator_traits {...}         // 泛化
template <class T> struct struct iterator_traits<T *> {}       //偏特化,传入指针
template <class T> struct struct iterator_traits<const T *> {} //偏特化,传入常量指针

4. 分配器allocators

使用方法:
eg. int *p = allocator<int>().allocate(512, (int *)0);  //首先是创建一个临时allocator对象,之后调用allocate函数分配512字节,且全部初始化为0。
allocator<int>().deallocate(p, 512);  //释放空间,这里要求告知分配的空间大小。
使用方法:
eg. int *p = allocator<int>().allocate(512);  //allocate函数第二个参数用默认值是0.
allocator<int>().deallocate(p, 512);

5. 容器之间实现关系

对于GCC2.9,属于早期的标准库版本,容器之间是复合的关系,而不是继承的关系。heap中拥有vector,priority-queue中拥有heap, stack和queue都拥有deque. 关联容器set、map、multiset、multimap都拥有rb_tree(高度平衡的二叉树).

6. 深度探索list

self operator++(int)
{
     self tmp = *this; //会调用iterator的拷贝构造函数是对list中的node进行拷贝,并不是调用operator*。
     ++*this;
     return tmp;  //这里返回的是对象。而前++返回的是reference。
}

对于整数变量,前++可以加两次,后++则不行。迭代器的自加也是按照这个原则设计的。

7. iterator需要遵循的原则

8. 深入探索vector

9. array和forward_list 单向链表

10.forward_list

上一篇 下一篇

猜你喜欢

热点阅读