迭代器是一种泛化的指针
。
iterator遵循的原则:
因为迭代器是算法连接容器的桥梁,算法通过迭代器操作容器实现算法的目标。所以算法有时需要去了解迭代器的特征(trait)
来更好的使用迭代器。
不同容器的迭代器都需要声明5个特征供算法查询:
_List_iterator内的5个 特征声明:
算法内获取迭代器特征的方法:
当迭代器I是一个class时可以直接获取
萃取机 traits
:
问题:当迭代器不是类时怎么办?例如是一个指针,无法进行typedef。
解决:利用一个萃取机 iterator_traits 可以分离class iterator 和non-class iterator。
template<typename I>
void algorithm(…)
{…
typename iterator_traits<I>::value_type v1; //如果I是一个class则直接返回其typedef的value_type,若I是一个指针则 iterator_traits通过其他操作返回正确的value_type值。
//v1为得到的类型名,可以用来声明变量。
…}
同理迭代器的5个特征都可以使用萃取机得到正确的值而不管迭代器是类还是指针。
如果是类则直接返回类内的typedef,如果是指针则用其他方法(针对指针的偏特化模板)
返回正确值。