ostream_iterator,istream_iterator

配接器的概念:

配接器(adapters)在STL组件的灵活组合运用功能上,扮演着轴承、转换器的角色。Adapter事实上是一种设计模式。在设计模式中的定义是:将一个class的接口转换为另一个class的接口,使原本接口不兼容而不能合作的classes,可以一起运作。

STL提供了许多应用于迭代器身上的配接器,

IOStream Iterator

所谓iostream iterators,可以将迭代器绑定到某个iostream对象身上,绑定到istream对象身上的,称为istream_iterator,拥有输入功能;绑定到ostream对象身上的,称为ostream_iterator,拥有输出功能。这种迭代器运用于屏幕输出。

ostream_iterator应用举例

int main()
{
	int ia[] = { 0,1,2,3,4,5 };
	ostream_iterator<int> outite(cout, " ");
	deque<int> id(ia, ia + 6);
	copy(id.begin(), id.end(), outite);
	cout << endl;
	system("pause");
	return 0;
}

上面这个程序是将outite绑定到cout。这样做之后,每次对outite指派一个元素,就后接一个“ ”。让我们看一下ostream_iterator的源码,就能知道它是怎么实现的了。

template <class T>
class ostream_iterator {
protected:
  ostream* stream;
  const char* string;
public:
  typedef output_iterator_tag iterator_category;
  typedef void                value_type;
  typedef void                difference_type;
  typedef void                pointer;
  typedef void                reference;

  ostream_iterator(ostream& s) : stream(&s), string(0) {}
  ostream_iterator(ostream& s, const char* c) : stream(&s), string(c)  {}
  ostream_iterator<T>& operator=(const T& value) { 
    *stream << value;
    if (string) *stream << string;
    return *this;
  }
  ostream_iterator<T>& operator*() { return *this; }
  ostream_iterator<T>& operator++() { return *this; } 
  ostream_iterator<T>& operator++(int) { return *this; } 
};
从源码中可以看出,ostream_iterator有两个数据成员,一个是输出流类型的指针,另一个是一个字符串。上面的程序用的是第二个构造函数,传入了一个输出流对象cout和一个字符串" "。然后ostream_iterator重载了运算符=,所以通过copy赋值时,输出的将是

*stream << value;
if (string) *stream << string;
这样就完成了配接器的输出。

istreram_iterator

class istream_iterator {
  friend bool
  operator== __STL_NULL_TMPL_ARGS (const istream_iterator<T, Distance>& x,
                                   const istream_iterator<T, Distance>& y);
protected:
  istream* stream;
  T value;
  bool end_marker;
  void read() {
    end_marker = (*stream) ? true : false;
    if (end_marker) *stream >> value;
    end_marker = (*stream) ? true : false;
  }
public:
  typedef input_iterator_tag iterator_category;
  typedef T                  value_type;
  typedef Distance           difference_type;
  typedef const T*           pointer;
  typedef const T&           reference;

  istream_iterator() : stream(&cin), end_marker(false) {}
  istream_iterator(istream& s) : stream(&s) { read(); }
  reference operator*() const { return value; }
istream_iterator<int> inite(cin);
这就是将inite绑定到了cin。istreram_iterator的第二个构造函数会调用成员函数read(),完成输入功能。




猜你喜欢

转载自blog.csdn.net/wk_bjut_edu_cn/article/details/80000534
今日推荐