本系列文章的目录在这里:目录. 通过目录里可以对STL总体有个大概了解 #前言 本文介绍了STL中的迭代器相关的类型和特性,它们用来定义和区分不同的迭代器类型。如iterator tag作为迭代器的“标签”用来区分迭代器的类型;iterator traits定义了所有类型的迭代器都应该有的公共信息。那标准库为什么提供这些东西呢?答案是我们可以根据这些信息来编写泛型代码,在泛型代码里根据iterator traits来判定迭代器的类型以做相应处理、可以自己定义迭代器实现自定义的迭代器操作。
forward_iterator_tag
和bidirectional_terator_tag
的继承关系可知,它们分别对应的迭代器类型,Bidirectional Iterator “IS A” Forward Iterator. 意味着可以用Forward Iterator 的地方,丢一个Bidirectional Iterator过去也是可以的。
...
本系列文章的目录在这里:目录. 通过目录里可以对STL总体有个大概了解 #前言 本文介绍了STL中的迭代器适配器(iterator adapter)的概念及其使用方法示例。迭代器适配器可以和标准库中的算法配合使用,达到一些特殊的效果。 迭代器适配器分为以下几类:
本系列文章的目录在这里:目录. 通过目录里可以对STL总体有个大概了解
#前言
本文介绍了STL中的迭代器的概念和五种类别的迭代器:Output iterator
, Input iterator
, Forward iterator
, Bidirectional iterator
, Random-access iterator
.
迭代器是为了表示容器中某个元素位置这个概念而产生的,有一般到特殊(“高级”)可以把它分成五类,如下表所示:
iterator分类 | 能力 | 由谁提供 |
---|---|---|
Output iterator 输出迭代器 | 向前写 | ostream, inserter |
Input Input 输入迭代器 | 向前读, 每个元素只能读一次 | istream |
Forward iterator 前向迭代器 | 向前读 | forward_list , unordered containers(无序容器) |
Bidirectional iterator双向迭代器 | 可向前向后两个方向读取 | list, set(multiset), map(multimap) |
Random-access iterator 随机访问迭代器 | 随机读取 | array, vector, deque, string, C风格数组 |
<algorithm>
中的以及各种容器的成员函数,还有各种功能函数,比如迭代器辅助函数(advance, next, prev, distance, iter_swap)等,有很多都是以迭代器作为输入参数的,这些函数中,形参类型越是“一般”,说明其使用范围越大。这里所说的“一般”指的就是上面5类迭代器中“低级”的迭代器,比如Input iterator和Output iterator就比Forward iterator一般,Forward iterator比Bidirectional iterator一般,Bidirectional iterator又比Random-access iterator一般。
假设有两个算法,f和g,f接受Input iterator类型的参数,而g接受Random-access类型的参数,那么f的作用范围就比g大,因为所有的Forward, Bidirectional和Random-access迭代器都可以作为f的参数,而g只能使用Random-access参数。
...
本系列文章的目录在这里:目录. 通过目录里可以对STL总体有个大概了解
#前言
本文介绍了STL中的迭代器辅助函数的用法及注意事项,这些迭代器辅助函数包括:advance
, next
(since C++11), prev
(since C++11), distance
, iter_swap
.
使用这些辅助函数需要包含头文件:#include <iterator>
advance, next, prev, distance这四个辅助函数使得所有迭代器都拥有类似随机访问迭代器的特性,比如advance(iter, n)可以使得前向迭代器直接向前移动n个位置,类似随机迭代器的iter+n操作。
newPos = pos + 10
, 这就要求只有随机迭代器才会通过编译。而若使用newPos = next(pos, 10)
, 那么就不会有随机迭代器的限制。即使我中途改变了容器和迭代器的类型,也不用修改这段代码。值得一提的是,使用这几个辅助函数并不会造成性能损失,因为其内部会根据迭代器的iterator traits
采取不同的策略来移动迭代器,对随机迭代器调用这些函数是一个常量时间的操作,对前向和双向迭代器则和自己手写循环一样,是个线性时间的操作。
本系列文章的目录在这里:目录. 通过目录里可以对STL总体有个大概了解
#前言
本文介绍了STL中的序列式容器std::forward_list
, 从它的名字就能推测出来,它是单向的,只能前进(forward). 确实如此,它其实就是对C语言风格的单链表的封装,仅提供有限的接口,相对于std::list(双向链表,并且定义很多接口)来说它节省了内存,同时又有比list更好的运行时性能;相对于自己实现的C风格的单链表(hand-written c-style linked list)而言,forward_list
也有与其不相上下的效率表现.
正如标准库所说的那样:
“...forward_list
设计的目标是, 使用forward_list
不会比使用自己手写的C风格单链表有更多的时间和空间的开销, 任何有悖于这个目标的接口和特性都会被标准拒之门外”