stl之iterator_category

首先要知道 stl 的算法是什么?

算法(Algorithm)是 function template,Algorithm 看不见容器(Containers),所以要从 iterator 取信息,iterator 必须回答 Algorithm 的问题来进行操作

iterator 的 iterator_category

image

iterator_category 对算法的影响

以 distance 函数为例,如果通过 iterator_trait 取得的 iterator_category 是 random_access_iterator_tag,那直接就特化用 last - first 相减就可以;如果是 input_iterator_tag 那就需要从 first++ 一直到 last 才能得到结果,他们之间的运算效率不一样


在写 distance 返回类型时也不要随便放,可以来问 iterator_traits 的 different_type

image

下面是以 advance 为例的代码参考
image

那为什么一共有 4 种 category(除了output_iterator_tag),为什么没有把其他的都写出来呢?
是因为他们之间有继承关系,是 is a,总有一种 category 会对应起来

iterator_category 和 type traits 对算法的影响

其实也还是对 iterator_category 和 type traits 的不同进行不一样的步骤
以 copy 函数为例子:
image

源码中对 iterator_category 的暗示

例如在 sort 的类模板函数中,把通常用的 T 写成 RandomAccessIterator,意思是要这种类型的参数,如果是别的也会通过,但是在后续操作中很可能报错
image

posted @ 2023-03-20 23:41  acwarming  阅读(39)  评论(0编辑  收藏  举报