文章目录
- 1.迭代器分类
- 2.迭代器使用
- 3.模拟实现迭代器
- 3.1 各个类的迭代器
- 3.2 所有容器的迭代器(迭代器适配器)
1.迭代器分类
迭代器按照定义方式分成以下四种。
- 正向迭代器,定义方法如下:
容器类名::iterator 迭代器名;
- 常量正向迭代器,定义方法如下:
容器类名::const_iterator 迭代器名;
- 反向迭代器,定义方法如下:
容器类名::reverse_iterator 迭代器名;
- 常量反向迭代器,定义方法如下:
容器类名::const_reverse_iterator 迭代器名;
2.迭代器使用
3.模拟实现迭代器
3.1 各个类的迭代器
3.2 所有容器的迭代器(迭代器适配器)
// 所有容器的反向迭代器
// 迭代器适配器
namespace bit
{
// vector<T>::iterator ->
// list<T>::iterator ->
template<class Iterator, class Ref, class Ptr>
struct ReverseIterator
{
typedef ReverseIterator<Iterator, Ref, Ptr> Self;
Iterator _it;//正向迭代器用一个节点的指针构造
ReverseIterator(Iterator it)//反向迭代器封装一个正向迭代器
:_it(it)
{}
Ref operator*()
{
Iterator tmp = _it;
return *(--tmp);
}
Ptr operator->()
{
//return _it->;
//return _it.operator->();
return &(operator*());
}
Self& operator++()//反向迭代器的++是正向迭代器的--
{
--_it;
return *this;
}
Self& operator--()//同上
{
++_it;
return *this;
}
bool operator!=(const Self& s)
{
return _it != s._it;
}
};
template<class T>
class vector
{
public:
typedef T* iterator;
typedef const T* const_iterator;
// 反向迭代器适配支持
typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
const_reverse_iterator rbegin() const
{
// list_node<int>*
return const_reverse_iterator(end());
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin());
}
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
iterator begin()
{
return _start;
}
iterator end()
{
return _finish;
}
const_iterator begin() const
{
return _start;
}
const_iterator end() const
{
return _finish;
}
};
template<class T>
class list
{
typedef list_node<T> Node;
public:
typedef __list_iterator<T, T&, T*> iterator;
typedef __list_iterator<T, const T&, const T*> const_iterator;
// 反向迭代器适配支持
typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
const_iterator begin() const
{
// list_node<int>*
return const_iterator(_head->_next);
}
const_iterator end() const
{
return const_iterator(_head);
}
iterator begin()
{
return iterator(_head->_next);
//return _head->_next;
}
iterator end()
{
return iterator(_head);
}
const_reverse_iterator rbegin() const
{
// list_node<int>*
return const_reverse_iterator(end());
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin());
}
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
};
};
在这个反向迭代器的实现中,并没有直接针对特定容器类型进行编码,而是使用了模板。这个模板接受三个模板参数:
①Iterator:表示要适配的容器的迭代器类型。
②Ref:表示返回值的引用类型,通常是迭代器指向元素的引用类型。
③Ptr:表示返回值的指针类型,通常是迭代器指向元素的指针类型。
因此,只要你有一个满足上述条件的迭代器,这个适配器就可以适配你的容器。比如,你可以将这个适配器用于std::vector、std::list等STL容器的迭代器,甚至可以用于你自己实现的容器的迭代器(只要满足上述条件)。