STL的stack和queue(二):反向迭代器的实现(了解)

目录

list的反向迭代器 

节点模板

list模板

正向迭代器的类模板

反向迭代器的类模板 

完整代码

list.h文件

ReverseIterator.h文件

test.cpp文件


list的反向迭代器 

迭代器的适配器模式:编写一个通用的反向迭代器类模板,传递不同容器的正向迭代器,编译器将自动生成这些容器的反向迭代器,减少代码的重复实现,简化编程

STL的stack和queue(二):反向迭代器的实现(了解)_第1张图片

节点模板

template
struct ListNode
{
	ListNode* _next;
	ListNode* _prev;
	T _data;

	ListNode(const T& x = T())//结点中存放的数据是T类型的对象
		: _next(nullptr)
		, _prev(nullptr)
		, _data(x)
	{}
};

list模板

template
class list
{
	typedef ListNode Node;
public:
	//<正向迭代器>
	typedef ListIterator iterator;//正向迭代器的类模板
	typedef ListIterator const_iterator;//const正向迭代器的类模板

	//<反向迭代器> 
	typedef ReverseIterator reverse_iterator;//反向迭代器的类模板
	typedef ReverseIterator const_reverse_iterator;//const反向迭代器的类模板


	reverse_iterator rbegin()
	{
		return reverse_iterator(end());
	}

	reverse_iterator rend()
	{
		return reverse_iterator(begin());
	}

	const_reverse_iterator rbegin()
	{
		return reverse_iterator(end());
	}

	const_reverse_iterator rend()
	{
		return reverse_iterator(begin());
	}

	iterator begin()
	{
		return _head->_next;
	}

	iterator end()
	{
		return _head;
	}

	// T* const p1
	// const T* p2
	const_iterator begin() const
	{
		return _head->_next;
	}

	const_iterator end() const
	{
		return _head;
	}

	void empty_init()
	{
		_head = new Node;//因为重命名的缘故,new Node相当于new ListNode,T的类型是this确定的,通过调试可以发现this指针的类型为bit::lits*,故T的类型也为int
		_head->_next = _head;
		_head->_prev = _head;

		_size = 0;
	}

	list()
	{
		empty_init();
	}

	//C++11的initializer_list
	list(initializer_list il)
	{
		empty_init();

		for (auto& e : il)
		{
			push_back(e);
		}
	}

	// lt2(lt1)
	list(const list& lt)
	{
		empty_init();
		for (auto& e : lt)
		{
			push_back(e);
		}
	}

	void swap(list& lt)
	{
		std::swap(_head, lt._head);
		std::swap(_size, lt._size);
	}

	// lt1 = lt3
	list& operator=(list lt)
	{
		swap(lt);
		return *this;
	}

	void clear()
	{
		iterator it = begin();
		while (it != end())
		{
			it = erase(it);
		}
	}

	~list()
	{
		clear();
		delete _head;
		_head = nullptr;
	}

	void push_back(const T& x)
	{
		insert(end(), x);
	}

	void push_front(const T& x)
	{
		insert(begin(), x);
	}

	void pop_back()
	{
		erase(--end());
	}

	void pop_front()
	{
		erase(begin());
	}

	void insert(iterator pos, const T& val)
	{
		Node* cur = pos._node;
		Node* newnode = new Node(val);
		Node* prev = cur->_prev;

		// prev newno

你可能感兴趣的:(STL的stack和queue(二):反向迭代器的实现(了解))