阅前提要:
本文主要是对list和vector的实现的补充,以代码实现为主,注释为辅,如果对vector,list底层实现感兴趣的可以自行阅读,代码量有点大,请大家耐心查看,对理解语言很有帮助(本文的实现方式并不是stl标准库中的实现,但大致的思路一样)
一、反向迭代器的实现
实现思想:反向迭代器和正向迭代器的不同点只在于++,--时迭代器的移动方向不同,其他的操作基本一样,我们可以对正向迭代器进行封装,从而得到反向迭代器,代码如下
namespace zxws
{
// 适配器 -- 复用
//这里细节关键在于模板参数可以传任何一个容器的正向迭代器,
//即只要该容器的正向迭代器实现了,那么反向迭代器也就实现了(这就是模板的力量)
template<class Iterator, class Ref, class Ptr>
struct Reverse_iterator
{
Iterator _it;//这是正向迭代器
typedef Reverse_iterator Self;
Reverse_iterator(Iterator it)
:_it(it)
{}
bool operator==(const Self& s)
{
return _it == s._it;
}
bool operator!=(const Self& s)
{
return _it != s._it;
}
//这个函数的实现和我们默认的rbegin()和rend()的位置有关
//下面的代码实现是默认rbegin()是end() rend()是begin()
Ref operator*()
{
Iterator cur = _it;
return *(--cur);
}
Ptr operator->()
{
return &(operator*());
}
Self& operator++()
{
--_it;
return *this;
}
Self& operator--()
{
++_it;
return *this;
}
Self operator++(int)
{
Self tmp(_it);
--_it;
return tmp;
}
Self operator--(int)
{
Self tmp(_it);
++_it;
return tmp;
}
};
}
二、list的实现
思路:本质和数据结构中的双向循环链表一样,只是用C++的语法实现的,不同点在迭代器
代码如下
namespace zxws
{
template<class T>
struct Node {
T _val;
Node* _next;
Node* _pre;
Node(const T& x=T())
:_val(x)
,_next(nullptr)
,_pre(nullptr)
{}
};
//正向迭代器的实现
template<class T,cla

本文以代码实现为主、注释为辅,对list和vector的实现进行补充。介绍了反向迭代器的实现,通过封装正向迭代器得到;还阐述了list和vector的实现思路,分别类似双向循环链表和动态数组,只是用C++语法实现,不同点在于迭代器。
最低0.47元/天 解锁文章
13万+

被折叠的 条评论
为什么被折叠?



