1.准备工作
在第二讲中主要讲到标准库中容器的源码,这里主要讲一讲标准库算法。如下
通常算法会有第二个版本,名称相同,参数不同,如下算法,第一个有两个参数,第二个有三个参数,其中第三个参数,就是允许我们用户自己传入一个准则。例如排序算法,我们就可以传入一个准则,即如何比较大小。Algorithms如果需要知道容器的某一些性质,则iterators必须进行回答,如果iterators没办法回答,则编译器编译到这一行语句的时候就会出错。
前面我们已经提到迭代器应该提供五个相关类型,由于搭配着算法,所以我们来了解在分类这件事情上是如何设计的。我们看看容器的性质,vector,array是连续空间,所以其迭代器类型为random_access,而deque虽然是分段连续,但是对外号称连续所以其迭代器类型也应为random_access.而list 为双向链表,所以其迭代器类型为bidirectional_iteration,而forword_list则为forward_iterator.至于set,multi_set,map和multi_map虽然我们看不出来,但是他们底部是以红黑书做支撑的,红黑树是双向的,所以其迭代器类型为bidirectional_iteration。其次unordered_set,unordered_multiset,unordered_map,unordered_multimap我们知道其底部是以哈希表做支撑的,他是一个链表,所以取决于这个链表是双向链表还是单向链表,这样就可以判断迭代器的类型。至于input_iterator_tag和output_iterator_tag则是输入输出流的迭代器类型,这两个很特别。
现在我们来看看istream_iterator的iterator_category..不同版本的编译器做法不一样,但是他们提供的接口必须一致。我们可以从下面的源代码中看到,istream_iterator中明确定义了iterator的类型为input_iterator。ostream_iterator类似。