STL 笔记(四) 迭代器 iterator

来源:互联网 发布:缠中说禅炒股软件 编辑:程序博客网 时间:2024/05/16 06:38

转载:http://blog.csdn.net/thisinnocence/article/details/39909787



stl 中迭代器可以理解为面向对象版本的广义指针,提供了对容器中的对象的访问方法,可以遍历容器所有元素,也可以访问任意元素。stl 迭代器有以下五种:

  • Input iterators   只读,输入迭代器,支持如:istream
  • Output iterators  只写,输出迭代器,支持如:ostream、inserter
  • Forward iterators 读写,前向迭代器,只能前向移动
  • Bidirectional iterators 读写,双向迭代器,能够双向移动,支持如: list、set、map
  • Random access iterators 读写,随机迭代器,可以随机访问,支持如:vector、deque、string

从功能上看,输入和输出迭代器并列,然后前向迭代器、双向迭代器和随机迭代器之间的关系就类似于类的继承关系。比如,可以将随机访问迭代器作为双向迭代器或前向迭代器来使用。

举例:

stl 中的 find 函数需要输入迭代器:

[cpp] view plaincopy
  1. template <class _InputIter, class _Tp>  
  2. inline _InputIter find(_InputIter __first, _InputIter __last,  
  3.                        const _Tp& __val,  
  4.                        input_iterator_tag)  
  5. {  
  6.   while (__first != __last && !(*__first == __val))  
  7.     ++__first;  
  8.   return __first;  
  9. }  

stl 中 的 generate_n 函数需要输出迭代器:

[cpp] view plaincopy
  1. /* The generate_n algorithm traverses the range [first, first + n) 
  2.    assigning to each element the value returned by gen. Note that generate 
  3.    modifies  the elements in the specified range.  */  
  4. template <class _OutputIter, class _Size, class _Generator>  
  5. _OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) {  
  6.   __STL_REQUIRES(_OutputIter, _OutputIterator);  
  7.   for ( ; __n > 0; --__n, ++__first)  
  8.     *__first = __gen();  
  9.   return __first;  
  10. }  

stl 中 replace 函数要求前向迭代器:

[cpp] view plaincopy
  1. template <class _ForwardIter, class _Tp>  
  2. void replace(_ForwardIter __first, _ForwardIter __last,  
  3.              const _Tp& __old_value, const _Tp& __new_value) {  
  4.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);  
  5.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,  
  6.          typename iterator_traits<_ForwardIter>::value_type, _Tp);  
  7.   __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);  
  8.   for ( ; __first != __last; ++__first)  
  9.     if (*__first == __old_value)  
  10.       *__first = __new_value;  
  11. }  

stl 中的 reverse 函数要求双向迭代器:

[cpp] view plaincopy
  1. template <class _BidirectionalIter>  
  2. inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {  
  3.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);  
  4.   __reverse(__first, __last, __ITERATOR_CATEGORY(__first));  
  5. }  

stl 中的 sort 函数要求随机访问迭代器:

[cpp] view plaincopy
  1. template <class _RandomAccessIter>  
  2. inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {  
  3.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);  
  4.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,  
  5.                  _LessThanComparable);  
  6.   if (__first != __last) {  
  7.     __introsort_loop(__first, __last,  
  8.                      __VALUE_TYPE(__first),  
  9.                      __lg(__last - __first) * 2);  
  10.     __final_insertion_sort(__first, __last);  
  11.   }  
  12. }  

【原文:http://blog.csdn.net/thisinnocence/article/details/39909787】
0 0
原创粉丝点击