C++反向迭代器的底层实现——vector——再次体会类和对象的魅力
·


文章目录
如果你第一眼看到这些一个套一个的代码会不会感觉到头疼?
list构造
步骤一、list类的基本构造
成员变量的声明、默认构造函数、带参函数的构造、析构函数
template<class T>
class My_vector
{
using iterator = T*;
using const_iterator = const T*;
public:
//这里的默认构造函数可以省略掉
My_vector()
:_st(nullptr)
,_size(0)
,_capacity(0)
{}
};
//带参函数的构造(方便初始化)
My_vector(size_t n,const T&val= T())//使用缺省值
//初始化列表
:_size(n)
,_capacity(n)
{
//开辟空间
_st = new T[n];
//初始化元素
for (size_t i = 0; i < n; i++)
{
_st[i] = val;
}
}
~My_vector()
{
delete[]_st;
_st = nullptr;
}
T* _st;
size_t _size;
size_t _capacity;
步骤二、迭代器的构造
iterator begin()
{
return _st;//返回开始的迭代器
}
const_iterator begin()const
{
return _st;
}
iterator end()
{
return _st+_size;
}
const_iterator end()const
{
return _st+_size;
}
关键步骤三、反向迭代器的初始构造
反向迭代器的模板需要三各类,反向迭代器里面存储正向迭代器
template<class Iterator,class Ref,class Ptr>//反向迭代需要三个类
struct ReverseIterator
{
Iterator _it; // 存储正向迭代器
//构造函数:
ReverseIterator(Iterator it)
:_it(it)
{};
};
关键步骤四、My_vector里面 模板实例化ReverseIterator
using iterator = T*;
using const_iterator = const T*;
using reverse_iterator = ReverseIterator<iterator, T&, T*>;
using const_reverse_iterator = ReverseIterator<const_iterator, const T&, const T*>;
//3.反向迭代器的begin和end(rbegin/rend)
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
const_reverse_iterator rbegin()const
{
return const_reverse_iterator(end());
}
const_reverse_iterator rend()const
{
return const_reverse_iterator(begin());
步骤五、补全ReverseIterator里面的成员函数
//反向迭代器operator*
Ref operator*()const
{
Iterator tmp = _it;
--tmp;
return *tmp;
}
//反向迭代器的operator++
ReverseIterator& operator++()
{
--_it;
return *this;
}
//比较迭代器是否不等
bool operator != (const ReverseIterator & other)const
{
return _it != other._it;
}
步骤六、main函数调试
// 测试代码
int main()
{
My_vector<int> vec(3, 5); // [5,5,5]
for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit)
{
std::cout << *rit << " "; // 输出:5 5 5
}
std::cout << std::endl;
My_vector<int> vec2(3);
vec2._st[0] = 1;
vec2._st[1] = 2;
vec2._st[2] = 3;
vec2._size = 3;
for (auto rit = vec2.rbegin(); rit != vec2.rend(); ++rit)
{
std::cout << *rit << " "; // 输出:3 2 1
}
std::cout << std::endl;
return 0;
}
整体代码
#include<iostream>
template<class Iterator,class Ref,class Ptr>//反向迭代需要三个类
struct ReverseIterator
{
Iterator _it; // 存储正向迭代器
//构造函数:
ReverseIterator(Iterator it)
:_it(it)
{};
//反向迭代器operator*
Ref operator*()const
{
Iterator tmp = _it;
--tmp;
return *tmp;
}
//反向迭代器的operator++
ReverseIterator& operator++()
{
--_it;
return *this;
}
//比较迭代器是否不等
bool operator != (const ReverseIterator & other)const
{
return _it != other._it;
}
};
template<class T>
class My_vector
{
using iterator = T*;
using const_iterator = const T*;
using reverse_iterator = ReverseIterator<iterator, T&, T*>;
using const_reverse_iterator = ReverseIterator<const_iterator, const T&, const T*>;
public:
My_vector()
:_st(nullptr)
,_size(0)
,_capacity(0)
{}
//带参函数的构造(方便初始化)
My_vector(size_t n,const T&val= T())//使用缺省值
//初始化列表
:_size(n)
,_capacity(n)
{
//开辟空间
_st = new T[n];
//初始化元素
for (size_t i = 0; i < n; i++)
{
_st[i] = val;
}
}
iterator begin()
{
return _st;//返回开始的迭代器
}
const_iterator begin()const
{
return _st;
}
iterator end()
{
return _st+_size;
}
const_iterator end()const
{
return _st+_size;
}
//3.反向迭代器的begin和end(rbegin/rend)
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
const_reverse_iterator rbegin()const
{
return const_reverse_iterator(end());
}
const_reverse_iterator rend()const
{
return const_reverse_iterator(begin());
}
~My_vector()
{
delete[]_st;
_st = nullptr;
}
T* _st;
size_t _size;
size_t _capacity; //只有定义了后面才会方便使用
};
// 1. 定义list的节点结构
template<class T>
struct list_node
{
T data;
list_node* prev;
list_node* next;
// 节点构造函数
list_node(const T& val = T())
: data(val), prev(nullptr), next(nullptr)
{}
};
// 测试代码
int main()
{
My_vector<int> vec(3, 5); // [5,5,5]
for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit)
{
std::cout << *rit << " "; // 输出:5 5 5
}
std::cout << std::endl;
return 0;
}
整个调用轨迹
1.1传参->调用构造函数


❀关键调试2.1条件判断、开通通过范围for打印
- 说明:
rbegin()通过return返回->调用拷贝构造 rit = vec.rbegin()赋值也需要调用拷贝构造 但这里优化了因此省略
这次的代码没有实现拷贝构造

2.2 代码::auto rit = vec.rbegin();
调用正向迭代器得rbegin()、
调用正向迭代器得end()、
调用反向迭代器reverse_iterator()、反向迭代器实例化
rbegin()->end()->reverse_iterator(end())




2.3调用正向迭代器得rend()、
调用正向迭代器得begin()、
调用反向迭代器reverse_iterator()、反向迭代器实例化
调用operator!=()
rend()->begin()->reverse_iterator(begin())->operator!=()




3.1开始输出
调用*()
调用++
operator*()->operator++



4.1重复操作2操作3 直至循环结束


关键步骤手记


更多推荐


所有评论(0)