配接器的概念:
配接器(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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/71e00beaa9bb7388905cdd00bd3c63a8.png)
上面这个程序是将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(),完成输入功能。