配接器的概念:
配接器(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(),完成输入功能。