iterator_traits是c11中的一个空类,主要用于区分不同类型的迭代器。
从 advancd() 函数开始
template<typename _InputIterator, typename _Distance>inline voidadvance(_InputIterator& __i, _Distance __n){// concept requirements -- taken care of in __advancetypename iterator_traits<_InputIterator>::difference_type __d = __n;std::__advance(__i, __d, std::__iterator_category(__i));}
__iterator_category(__i) 如下:
template<typename _Iter>inline typename iterator_traits<_Iter>::iterator_category__iterator_category(const _Iter&){ return typename iterator_traits<_Iter>::iterator_category(); }
而此处 iterator_traits<_Iter>::iterator_category() 的定义如下:
template<typename _Iterator,bool = __has_iterator_category<_Iterator>::value>struct __iterator_traits { };template<typename _Iterator>struct __iterator_traits<_Iterator, true>{typedef typename _Iterator::iterator_category iterator_category;typedef typename _Iterator::value_type value_type;typedef typename _Iterator::difference_type difference_type;typedef typename _Iterator::pointer pointer;typedef typename _Iterator::reference reference;};template<typename _Iterator>struct iterator_traits: public __iterator_traits<_Iterator> { };
可以看到iterator_category为 typedef typename _Iterator::iterator_category iterator_category
这里选择list
可以看到 list<int>::iterator 为typedef ``_List_iterator``<``_Tp``> ``iterator``;
在_List_iterator``<``_Tp``>内有typedef ``std``::``bidirectional_iterator_tag ``iterator_category``;
于是 iterator_traits<_Iter>::iterator_category 实际就是list<``int``>::iterator::iterator_category
也就是std``::``bidirectional_iterator_tag
疑问
实际上可以直接使用list<``int``>::iterator::iterator_category()
也就是 _Iter::iterator_category()
为什么要多加一个 iterator_traits 类呢
程序验证
#include <iostream>#include <vector>#include <iterator>#include <sstream>#include <list>#include <bits/stl_iterator_base_funcs.h>using namespace std;int main() {list<int> l = {1, 2, 3, 4, 5, 6, 7};auto lit = l.begin();__advance(lit, 2, list<int>::iterator::iterator_category());__advance(lit, 2, iterator_traits<list<int>::iterator>::iterator_category());cout << *lit;return 0;}
可能的原因
也许是为了统一管理,所以定义了一个 iterator_traits 类,由于是空类,实际上不会有太多的性能消耗。

