配接器(adaptor)在STL组件的灵活组合运用功能上,扮演者轴承、转换器的角色。
配机器分类:container adapters,iterator adapters,functor adapters。
下面来以iterator adapters来做例子
// C++ standard规定他们的接口在
#include
// SGI STL将他们实际定义于
#include
主要有三类iterator adapters:insert iterators,reverse iterators,iostream iterators
Insert iterators
可以将一般迭代器的赋值(assign)操作转变为插入(insert)操作,这样的迭代器专司尾端插入操作的back_insert_iterator(back_inserter)。专司头端插入操作的front_insert_iterator(front_inserter),可以从任意位置插入的insert_iterator(insert)
Reverse iterators
将一般迭代器的行进方向逆转,使原本应该前进的operator++编程了后退操作,倒转经脉
Iostream iterators
将迭代器绑定到某个iostream上,绑定到istream,成为istream_iterator,拥有输入功能;绑定到ostream,成为ostream_iterator,拥有输出功能,这种迭代器运用于屏幕输出,非常方便。
不废话了,直接拿Reverse iterators测试
先来看看stl_iterator.h
template<typename _Iterator>
class reverse_iterator // reverse_iterator类
: public iterator<typename iterator_traits<_Iterator>::iterator_category,
typename iterator_traits<_Iterator>::value_type,
typename iterator_traits<_Iterator>::difference_type,
typename iterator_traits<_Iterator>::pointer,
typename iterator_traits<_Iterator>::reference>
{
protected:
_Iterator current; // 输入迭代器对象
typedef iterator_traits<_Iterator> __traits_type;
public:
typedef _Iterator iterator_type;
typedef typename __traits_type::difference_type difference_type;
typedef typename __traits_type::pointer pointer;
typedef typename __traits_type::reference reference;
// 默认构造函数
_GLIBCXX17_CONSTEXPR
reverse_iterator() : current() {
}
// 单参数构造函数,参数为iterator_type,即迭代器
explicit _GLIBCXX17_CONSTEXPR
reverse_iterator(iterator_type __x) : current(__x) {
}
// 拷贝构造函数
_GLIBCXX17_CONSTEXPR
reverse_iterator(const reverse_iterator& __x)
: current(__x.current) {
}
// 如果大于c++11,禁止=运算符重载
#if __cplusplus >= 201103L
reverse_iterator& operator=(const reverse_iterator&) = default;
#endif
// 跨其他类型的reverse_iterator可以被复制
template<typename _Iter>
_GLIBCXX17_CONSTEXPR
reverse_iterator(const reverse_iterator<_Iter>& __x)
: current(__x.base()) {
}
// base()方法,返回本身
_GLIBCXX17_CONSTEXPR iterator_type
base() const
{
return current; }
// 运算符重载*
_GLIBCXX17_CONSTEXPR reference
operator*() const
{
_Iterator __tmp = current;
return *--__tmp;
}
// 运算符重载->
_GLIBCXX17_CONSTEXPR pointer
operator->() const
{
_Iterator __tmp = current;
--__tmp;
return _S_to_pointer(__tmp);
}
// 运算符重载++,后置递增
_GLIBCXX17_CONSTEXPR reverse_iterator&
operator++()
{
--current;
return *this;
}
// 运算符重载++,前置递增
_GLIBCXX17_CONSTEXPR reverse_iterator
operator++(int)
{
reverse_iterator __tmp = *this;
--current;
return __tmp;
}
// 运算符重载--,后置递减
_GLIBCXX17_CONSTEXPR reverse_iterator&
operator--()
{
++current;
return *this;
}
// 运算符重载--,前置递减
_GLIBCXX17_CONSTEXPR reverse_iterator
operator--(int)
{
reverse_iterator __tmp = *this;
++current;
return __tmp;
}
// 运算符重载+
_GLIBCXX17_CONSTEXPR reverse_iterator
operator+(difference_type __n) const
{
return reverse_iterator(current - __n); }
// 运算符重载+=
_GLIBCXX17_CONSTEXPR reverse_iterator&
operator+=(difference_type __n)
{
current -= __n;
return *this;
}
// 运算符重载-
_GLIBCXX17_CONSTEXPR reverse_iterator
operator-(difference_type __n) const
{
return reverse_iterator(current + __n); }
// 运算符重载-=
_GLIBCXX17_CONSTEXPR reverse_iterator&
operator-=(difference_type __n)
{
current += __n;
return *this;
}
// 运算符重载[]
_GLIBCXX17_CONSTEXPR reference
operator[](difference_type __n) const
{
return *(*this + __n); }
private:
// 私有静态成员函数,返回一个指针
template<typename _Tp>
static _GLIBCXX17_CONSTEXPR _Tp*
_S_to_pointer(_Tp* __p)
{
return __p; }
// 私有静态成员函数
template<typename _Tp>
static _GLIBCXX17_CONSTEXPR pointer
_S_to_pointer(_Tp __t)
{
return __t.operator->(); }
};
来看看SGI3.3版本的stl_vector.h(其他版本写法也是差不多的)
// 如果这个类支持偏特化,里面的这些元素就自动添加
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
typedef reverse_iterator<const_iterator> const_reverse_iterator;
typedef reverse_iterator<iterator> reverse_iterator;
// 如果这个类不支持偏特化
#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
// 反向迭代器
typedef reverse_iterator<const_iterator, value_type, const_reference,
difference_type> const_reverse_iterator;
typedef reverse_iterator<iterator, value_type, reference, difference_type>
reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
...
public:
reverse_iterator rbegin()
{
return reverse_iterator(end()); }
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(end()); }
reverse_iterator rend()
{
return reverse_iterator(begin()); }
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin()); }
我们来测试一下
#include
#include
int main() {
std::vector<int> v;
v.push_back(1);
v.push_back(9);
v.push_back(3);
v.push_back(5);
// 此处调用reverse_iterator
std::vector<int>::reverse_iterator it;
for (it = v.rbegin(); it != v.rend(); it++) {
std::cout << *it << std::endl;
}
// 5 3 9 1 逆向输出
return 0;
}
STL真的是一个很神奇的东西,希望大家努力去学啊!