zoukankan      html  css  js  c++  java
  • STL 笔记(四) 迭代器 iterator

    stl 中迭代器能够理解为面向对象版本号的广义指针,提供了对容器中的对象的訪问方法,能够遍历容器全部元素。也能够訪问随意元素。stl 迭代器有下面五种:
    • Input iterators   仅仅读,输入迭代器,支持如:istream
    • Output iterators  仅仅写,输出迭代器。支持如:ostream、inserter
    • Forward iterators 读写,前向迭代器。仅仅能前向移动
    • Bidirectional iterators 读写,双向迭代器,可以双向移动。支持如: list、set、map
    • Random access iterators 读写,随机迭代器,可以随机訪问,支持如:vector、deque、string

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

    举例:

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

    template <class _InputIter, class _Tp>
    inline _InputIter find(_InputIter __first, _InputIter __last,
                           const _Tp& __val,
                           input_iterator_tag)
    {
      while (__first != __last && !(*__first == __val))
        ++__first;
      return __first;
    }

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

    /* The generate_n algorithm traverses the range [first, first + n)
       assigning to each element the value returned by gen. Note that generate
       modifies  the elements in the specified range.  */
    template <class _OutputIter, class _Size, class _Generator>
    _OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
      __STL_REQUIRES(_OutputIter, _OutputIterator);
      for ( ; __n > 0; --__n, ++__first)
        *__first = __gen();
      return __first;
    }

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

    template <class _ForwardIter, class _Tp>
    void replace(_ForwardIter __first, _ForwardIter __last,
                 const _Tp& __old_value, const _Tp& __new_value) {
      __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
      __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
             typename iterator_traits<_ForwardIter>::value_type, _Tp);
      __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
      for ( ; __first != __last; ++__first)
        if (*__first == __old_value)
          *__first = __new_value;
    }

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

    template <class _BidirectionalIter>
    inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
      __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
      __reverse(__first, __last, __ITERATOR_CATEGORY(__first));
    }
    

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

    template <class _RandomAccessIter>
    inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
      __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
      __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
                     _LessThanComparable);
      if (__first != __last) {
        __introsort_loop(__first, __last,
                         __VALUE_TYPE(__first),
                         __lg(__last - __first) * 2);
        __final_insertion_sort(__first, __last);
      }
    }

    【原文:http://blog.csdn.net/thisinnocence/article/details/39909787】


  • 相关阅读:
    Winform 打包,卸载程序制作获取ProductCode
    委托/事件的重写
    反序列化无法找到程序集
    Control.Invoke注意事项
    操作config文件
    MemoEdit自动滚动到结尾
    读取局域网内的共享文件
    命令行卸载程序
    获取执行程序的路径
    SCSF 系列:使用 Visualizer 监控 SCSF 运行状态
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7383798.html
Copyright © 2011-2022 走看看