越到后面愈发感觉C++ STL里面的东西实在太过庞大,尽管侯老师足够深入浅出,但对于普通C++学习者来说,冰山一角也足够喝一壶。
本周的内容看起来比上周的内容更加琐碎。内容依然围绕着STL里面的六大元素进行。不过,本周似乎又再一次强调了算法这个部分。算法是固定的,通过询问迭代器问题来得到关于容器的一些信息,从而采取不同的计算策略来获得最高的效率。
作业看起来一眼无法令人看懂,因此在短暂看过前面关于迭代器和他们的分类之后,就往后跳到了inserter的内容查看了。因此,这篇笔记会在后面继续增加内容
1. 迭代器
struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
迭代器用了五种结构(类)来区分自己的类型,为什么用类而不是用枚举呢?因为,编译器在调用的时候可以使用C++的多态这种特性,来根据这五种类的继承关系来调用对应类型所适配的算法和函数。
2. 算法与traits的联系
在之前的的第七周的时候介绍过traints, 再简单的回顾一下, traits总共有5个typedef,主要用于告知算法,容器当前的各种信息; 算法根据traits的信息进行偏特化,进行针对性的计算,提高程序效率
template <typename _Tp>
{
iterator_category; 容器的类别
value_type;
pointer;
reference;
difference_type;
}
算法_advance通过容器类型的继承关系,以及模版的偏特化,来根据各个容器的特性计算距离,提高效率
3. 算法
函数模版
仿函数
适配器
inserter适配器
通过inserter适配器的包裹,把foo的insert操作,自动分配内存,适配到inseter重载的=号操作上去