类模板
<iterator>

std::back_insert_iterator

template <class Container> class back_insert_iterator;
后向插入迭代器

后向插入迭代器是特殊的输出迭代器,它们允许通常用于覆盖元素的算法(例如copy)改为在容器的末尾插入新元素。

该容器需要有一个push_back成员函数(例如标准容器vectordequelist)。

back_insert_iterator使用赋值运算符(在解引用时或不解引用时),都会导致容器扩展一个元素,该元素使用赋给它的值进行初始化。

back_insert_iterator也定义了输出迭代器的其他典型运算符,但这些运算符没有效果:所有赋给它们的值都会被插入到容器的末尾。

它的定义与以下行为相同:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class Container>
  class back_insert_iterator :
    public iterator<output_iterator_tag,void,void,void,void>
{
protected:
  Container* container;

public:
  typedef Container container_type;
  explicit back_insert_iterator (Container& x) : container(&x) {}
  back_insert_iterator<Container>& operator= (typename Container::const_reference value)
    { container->push_back(value); return *this; }
  back_insert_iterator<Container>& operator* ()
    { return *this; }
  back_insert_iterator<Container>& operator++ ()
    { return *this; }
  back_insert_iterator<Container> operator++ (int)
    { return *this; }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class Container>
  class back_insert_iterator :
    public iterator<output_iterator_tag,void,void,void,void>
{
protected:
  Container* container;

public:
  typedef Container container_type;
  explicit back_insert_iterator (Container& x) : container(&x) {}
  back_insert_iterator<Container>& operator= (const typename Container::value_type& value)
    { container->push_back(value); return *this; }
  back_insert_iterator<Container>& operator= (typename Container::value_type&& value)
    { container->push_back(std::move(value)); return *this; }
  back_insert_iterator<Container>& operator* ()
    { return *this; }
  back_insert_iterator<Container>& operator++ ()
    { return *this; }
  back_insert_iterator<Container> operator++ (int)
    { return *this; }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class Container>
  class back_insert_iterator :
    public iterator<output_iterator_tag,void,void,void,void>
{
protected:
  Container* container;

public:
  typedef Container container_type;
  explicit back_insert_iterator (Container& x) : container(std::addressof(x)) {}
  back_insert_iterator<Container>& operator= (const typename Container::value_type& value)
    { container->push_back(value); return *this; }
  back_insert_iterator<Container>& operator= (typename Container::value_type&& value)
    { container->push_back(std::move(value)); return *this; }
  back_insert_iterator<Container>& operator* ()
    { return *this; }
  back_insert_iterator<Container>& operator++ ()
    { return *this; }
  back_insert_iterator<Container> operator++ (int)
    { return *this; }
};

库提供了一个名为back_inserter的函数,该函数可以自动从一个合适的容器生成back_insert_iterator类。

模板参数

容器
一个具有定义的push_back成员的容器类(例如标准容器vectordequelist)。

成员类型

成员back_insert_iterator中的定义
iterator_categoryoutput_iterator_tag
value_typevoid
difference_typevoid
指针void
引用void
iterator_typevoid

成员函数

构造函数
back_insert_iterator对象是从一个容器构造的,它们在内部保留对该容器的引用。
operator=
在容器末尾插入一个新元素,并使用参数初始化它。
operator*
无操作。返回对象的引用。
operator++
无操作。返回对象的引用。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// back_insert_iterator example
#include <iostream>     // std::cout
#include <iterator>     // std::back_insert_iterator
#include <vector>       // std::vector
#include <algorithm>    // std::copy

int main () {
  std::vector<int> foo, bar;
  for (int i=1; i<=5; i++)
  { foo.push_back(i); bar.push_back(i*10); }

  std::back_insert_iterator< std::vector<int> > back_it (foo);

  std::copy (bar.begin(),bar.end(),back_it);

  std::cout << "foo:";
  for ( std::vector<int>::iterator it = foo.begin(); it!= foo.end(); ++it )
	  std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

输出

foo: 1 2 3 4 5 10 20 30 40 50


另见