iterator_traits是c11中的一个空类,主要用于区分不同类型的迭代器。

advancd() 函数开始

  1. template<typename _InputIterator, typename _Distance>
  2. inline void
  3. advance(_InputIterator& __i, _Distance __n)
  4. {
  5. // concept requirements -- taken care of in __advance
  6. typename iterator_traits<_InputIterator>::difference_type __d = __n;
  7. std::__advance(__i, __d, std::__iterator_category(__i));
  8. }

__iterator_category(__i) 如下:

  1. template<typename _Iter>
  2. inline typename iterator_traits<_Iter>::iterator_category
  3. __iterator_category(const _Iter&)
  4. { return typename iterator_traits<_Iter>::iterator_category(); }

而此处 iterator_traits<_Iter>::iterator_category() 的定义如下:

  1. template<typename _Iterator,
  2. bool = __has_iterator_category<_Iterator>::value>
  3. struct __iterator_traits { };
  4. template<typename _Iterator>
  5. struct __iterator_traits<_Iterator, true>
  6. {
  7. typedef typename _Iterator::iterator_category iterator_category;
  8. typedef typename _Iterator::value_type value_type;
  9. typedef typename _Iterator::difference_type difference_type;
  10. typedef typename _Iterator::pointer pointer;
  11. typedef typename _Iterator::reference reference;
  12. };
  13. template<typename _Iterator>
  14. struct iterator_traits
  15. : public __iterator_traits<_Iterator> { };

可以看到iterator_category为 typedef typename _Iterator::iterator_category iterator_category

这里选择list的迭代器
可以看到 list<int>::iteratortypedef ``_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 类呢

程序验证

  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <sstream>
  5. #include <list>
  6. #include <bits/stl_iterator_base_funcs.h>
  7. using namespace std;
  8. int main() {
  9. list<int> l = {1, 2, 3, 4, 5, 6, 7};
  10. auto lit = l.begin();
  11. __advance(lit, 2, list<int>::iterator::iterator_category());
  12. __advance(lit, 2, iterator_traits<list<int>::iterator>::iterator_category());
  13. cout << *lit;
  14. return 0;
  15. }

image.png
结果也验证了我的猜想。

可能的原因

也许是为了统一管理,所以定义了一个 iterator_traits 类,由于是空类,实际上不会有太多的性能消耗。