| 作者 | 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*对迭代器解引用结果应用函数对象并返回结果。 |
|---|
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_iterator是result_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.
类型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模型以下概念中最精炼的、同时也被模型为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>当且仅当X与Y.
除了参数所模拟的概念所要求的操作之外,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
此示例的源代码可以在这里找到。