在这里插入图片描述

❀保持低旋律节奏->个人主页

专栏链接:《C++学习》、《Linux学习》

在这里插入图片描述



如果你第一眼看到这些一个套一个的代码会不会感觉到头疼?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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传参->调用构造函数

在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cec5bad63f0f4ca68052b3285931def8.png

❀关键调试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 直至循环结束

在这里插入图片描述在这里插入图片描述

关键步骤手记

在这里插入图片描述

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐