Boost C++ 库

……世界上最受推崇且设计最专业的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码规范

转换迭代器 - Boost C++ 函数库

转换迭代器

作者 David Abrahams, Jeremy Siek, Thomas Witt
联系方式 dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
组织 Boost Consulting, 印第安纳大学 Open Systems Lab, 汉诺威大学 运输铁路运营与建设研究所
日期 2006-09-11
版权 Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
摘要 transform 迭代器通过修改operator*对迭代器解引用结果应用函数对象并返回结果。

transform_iterator概要

template <class UnaryFunction,
          class Iterator,
          class Reference = use_default,
          class Value = use_default>
class transform_iterator
{
public:
  typedef /* see below */ value_type;
  typedef /* see below */ reference;
  typedef /* see below */ pointer;
  typedef iterator_traits<Iterator>::difference_type difference_type;
  typedef /* see below */ iterator_category;

  transform_iterator();
  transform_iterator(Iterator const& x, UnaryFunction f);

  template<class F2, class I2, class R2, class V2>
  transform_iterator(
        transform_iterator<F2, I2, R2, V2> const& t
      , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
      , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
  );
  UnaryFunction functor() const;
  Iterator const& base() const;
  reference operator*() const;
  transform_iterator& operator++();
  transform_iterator& operator--();
private:
  Iterator m_iterator; // exposition only
  UnaryFunction m_f;   // exposition only
};

如果参考use_default然后reference成员transform_iteratorresult_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type。否则,reference参考.

如果use_default然后value_type成员是remove_cv<remove_reference<reference> >::type。否则,value_type.

如果Iterator模型 Readable Lvalue Iterator,并且如果Iterator模型 Random Access Traversal Iterator,则iterator_category可转换为random_access_iterator_tag。否则,如果Iterator模型 Bidirectional Traversal Iterator,则iterator_category可转换为bidirectional_iterator_tag否则iterator_category可转换为forward_iterator_tag。如果Iterator不模型 Readable Lvalue Iterator,则iterator_category可转换为input_iterator_tag.

transform_iteratorrequirements

类型UnaryFunction必须是 Assignable、Copy Constructible,并且表达式f(*i)必须是有效的,其中f是一个类型为UnaryFunction, i是一个对象,类型为Iterator的 const 对象,其中f(*i)的类型必须是result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type.

参数Iterator都必须是 Readable Iterator。

transform_iterator模型

生成的transform_iterator模型以下概念中最精炼的、同时也被模型为Iterator.

  • Writable Lvalue Iterator,如果transform_iterator::reference是一个非 const 引用。
  • Readable Lvalue Iterator,如果transform_iterator::reference是一个 const 引用。
  • 否则为可读迭代器(Readable Iterator)。

transform_iterator模型最精炼的标准遍历概念,同时也被Iterator参数。

如果transform_iterator是 Readable Lvalue Iterator 的模型,那么它根据Iterator参数模型,模型以下原始迭代器概念。

如果Iterator模型 transform_iterator模型
单次遍历迭代器 输入迭代器
前向遍历迭代器 前向迭代器
双向遍历迭代器 双向迭代器(Bidirectional Iterator)
随机访问遍历迭代器 随机访问迭代器

如果transform_iterator是 Writable Lvalue Iterator 的模型,那么它是一个可写迭代器(如旧迭代器要求中所定义)。

transform_iterator<F1, X, R1, V1>transform_iterator<F2, Y, R2, V2>当且仅当XY.

transform_iterator操作

除了参数所模拟的概念所要求的操作之外,transform_iterator, transform_iterator还提供了以下操作。

transform_iterator();

返回的一个实例transform_iterator带有m_fandm_iterator默认构造。

transform_iterator(Iterator const& x, UnaryFunction f);

返回的一个实例transform_iterator带有m_f初始化为fandm_iterator初始化为x.
template<class F2, class I2, class R2, class V2>
transform_iterator(
      transform_iterator<F2, I2, R2, V2> const& t
    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
);
返回的一个实例transform_iterator带有m_f初始化为t.functor()andm_iterator初始化为t.base().
要求OtherIterator隐式转换为Iterator.

UnaryFunction functor() const;

返回m_f

Iterator const& base() const;

返回m_iterator

reference operator*() const;

返回m_f(*m_iterator)

transform_iterator& operator++();

效果++m_iterator
返回*this

transform_iterator& operator--();

效果--m_iterator
返回*this
template <class UnaryFunction, class Iterator>
transform_iterator<UnaryFunction, Iterator>
make_transform_iterator(Iterator it, UnaryFunction fun);
返回的一个实例transform_iterator<UnaryFunction, Iterator>带有m_f初始化为fandm_iterator初始化为x.
template <class UnaryFunction, class Iterator>
transform_iterator<UnaryFunction, Iterator>
make_transform_iterator(Iterator it);
返回的一个实例transform_iterator<UnaryFunction, Iterator>带有m_f的常量对象,并已默认构造m_iterator初始化为x.

示例

这是一个使用 `transform_iterators` 类生成迭代器的简单示例,这些迭代器可以对解引用迭代器返回的值进行乘法(或加法)运算。在这个示例中使用 lambda 库会更酷。

int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
const int N = sizeof(x)/sizeof(int);

typedef boost::binder1st< std::multiplies<int> > Function;
typedef boost::transform_iterator<Function, int*> doubling_iterator;

doubling_iterator i(x, boost::bind1st(std::multiplies<int>(), 2)),
  i_end(x + N, boost::bind1st(std::multiplies<int>(), 2));

std::cout << "multiplying the array by 2:" << std::endl;
while (i != i_end)
  std::cout << *i++ << " ";
std::cout << std::endl;

std::cout << "adding 4 to each element in the array:" << std::endl;
std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus<int>(), 4)),
          boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)),
          std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;

找到。输出是

multiplying the array by 2:
2 4 6 8 10 12 14 16
adding 4 to each element in the array:
5 6 7 8 9 10 11 12

此示例的源代码可以在这里找到。