【C++】list的模拟实现

1.代码

#include<iostream>
#include<vector>
using namespace std;
namespace zz {
	template<class T>
struct Node
{
	Node(const T& data = T())
		:_pNext(nullptr)
		, _pPre(nullptr)
		, _data(data)
	{}
	T _data;
	Node<T> *_pNext;
	Node<T> *_pPre;
};

template<class T>
class list_iterator
{
	typedef Node<T> Node;
	typedef list_iterator<T> self;
public:
	list_iterator(Node *ptr)
		:_ptr(ptr)
	{}
	T& operator *()
	{
		return _ptr->_data;
	}
	T* operator ->()
	{
		return &(_ptr->_data);
	}
	self& operator ++()
	{
		_ptr = _ptr->_pNext;
		return *this;
	}
	self operator ++(T)
	{
		self tmp(*this);
		//self tmp(_ptr);
		_ptr = _ptr->_pNext;
		return tmp;
	}
	self& operator --()
	{
		_ptr = _ptr->_pPre;
		return *this;
	}
	self operator --(T)
	{
		self tmp(_ptr);
		_ptr = _ptr->_pPre;
		return tmp;
	}
	bool operator !=(const self& it)
	{
		return _ptr != it._ptr;
	}
	bool operator ==(const self& it)
	{
		return _ptr == it._ptr;
	}
	Node* _ptr;
};

template<class iterator, class T>
struct list_riterator
{
	typedef Node<T> Node;
	typedef list_riterator<iterator, T> self;
	list_riterator(Node *ptr)
		:_it(ptr)
	{}
	T& operator *()
	{
		auto it = _it;
		--it;
		return *it;
	}
	T* operator ->()
	{
		return &(operator *());
	}
	self& operator ++()
	{
		--_it;
		return *this;
	}
	self operator ++(T)
	{
		self tmp(_it._ptr);
		--_it;
		return tmp;
	}
	self& operator --()
	{
		++_it;
		return *this;
	}
	self operator --(T)
	{
		self tmp(_it._ptr);
		++_it;
		return tmp;
	}
	bool operator !=(self ptr)
	{
		return _it != ptr._it;
	}
	bool operator ==(self ptr)
	{
		return _it == ptr._it;
	}
	iterator _it;
};

template<class T>
class list
{
	typedef Node<T> Node;
	typedef list_iterator<T> iterator;
	typedef const list_iterator<T> const_iterator;
	typedef list_riterator<iterator, T> riterator;
public:
	list()
	{
		CreateHead();
	}
	list(int n, const T& data)
	{
		CreateHead();
		for (int i = 0; i < n; i++)
			push_back(data);
	}
	template<class Iterator>
	list(Iterator first, Iterator last)
	{
		CreateHead();
		while (first != last)
		{
			push_back(*first);
			++first;
		}
	}
	list(const list<T>& L)
	{
		CreateHead();
		iterator it = L.begin();
		while (it != L.end())
		{
			push_back(*it);
			++it;
		}
	}
	list<T>& operator=(const list<T>& L)
	{
		if (this != &L)
		{
			clear();
			auto it = L.begin();
			while (it != L.end())
			{
				push_back(*it);
				++it;
			}
		}
		return *this;
	}
	~list()
	{
		clear();
		delete _pHead;
	}
	iterator begin()
	{
		return iterator(_pHead->_pNext);
	}
	iterator begin()const
	{
		return iterator(_pHead->_pNext);
	}
	iterator end()
	{
		return iterator(_pHead);
	}
	iterator end()const
	{
		return iterator(_pHead);
	}
	riterator rbegin()
	{
		return riterator(_pHead);
	}
	riterator rend()
	{
		return riterator(_pHead->_pNext);
	}
	size_t size()const
	{
		size_t count = 0;
		auto it = begin();
		while (it != end())
		{
			++it;
			++count;
		}
		return count;
	}
	bool empty()const
	{
		return _pHead->_pNext == _pHead;
	}
	void resize(int n, const T& data = T())
	{
		int oldsize = size();
		if (n > oldsize)
		{
			for (int i = oldsize; i < n; i++)
				push_back(data);
		}
		else
		{
			for (int i = n; i < oldsize; i++)
				pop_back();
		}
	}
	T& front()
	{
		return _pHead->_pNext->_data;
	}
	const T& front()const
	{
		return _pHead->_pNext->_data;
	}
	T& back()
	{
		return _pHead->_pPre->_data;
	}
	const T& back()const
	{
		return _pHead->_pPre->_data;
	}
	void push_back(const T& data)
	{
		insert(end(), data);
	}
	void clear()
	{
		Node* it = _pHead->_pNext;
		while (it != _pHead)
		{
			_pHead->_pNext = it->_pNext;
			delete it;
			it = _pHead->_pNext;
		}
		_pHead->_pNext = _pHead;
		_pHead->_pPre = _pHead;
	}
	void pop_back()
	{
		erase(--end());
	}
	iterator insert(iterator pos, const T& data)
	{
		Node *node = pos._ptr;
		Node *pt = new Node(data);
		pt->_pPre = node->_pPre;
		pt->_pNext = node;
		node->_pPre = pt;
		pt->_pPre->_pNext = pt;
		return iterator(pt);
	}
	iterator erase(iterator pos)
	{
		Node *pt = pos._ptr;
		if (pt == _pHead)
			return end();
		Node *ret = pt->_pNext;
		pt->_pPre->_pNext = pt->_pNext;
		pt->_pNext->_pPre = pt->_pPre;
		delete pt;
		return iterator(ret);
	}
	void push_front(const T& data)
	{
		insert(begin(), data);
	}
	void pop_front()
	{
		erase(begin());
	}
	void swap(list<T> L)
	{
		swap(_pHead, L._pHead);
	}
private:
	void CreateHead()
	{
		_pHead = new Node();
		_pHead->_pNext = _pHead;
		_pHead->_pPre = _pHead;
		_pHead->_data = NULL;
	}
protected:
	Node* _pHead;
};
}
void test() {
	zz::list<int> l1;
	zz::list<int> l2(10, 5);
	vector <int> v{ 1,2,3,4,5,6,7,8,9,0 };
	l2.push_back(9);
	zz::list<int> l3(v.begin(), v.end());
	zz::list<int> l4(l2);
	auto it = l2.begin();
	while (it != l2.end()) {
		cout << *it << " ";
		it++;
	}
	cout << endl;
	for (auto e : l3)
		cout << e << " ";
	cout << endl;
}
int main() {
	test();
	return 0;
}

二.截图实现

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用和提供了关于实现vector的两种方法。其中,引用展示了一个使用reserve和push_back方法的示例,而引用展示了一个使用new和memcpy函数的示例。这两种方法都是常见的实现vector的方式。 在第一种方法中,通过reserve函数可以预留足够的内存空间,然后使用push_back函数逐个将元素添加到vector中。这种方法的好处是可以避免不必要的内存重分配,提高了效率。 而第二种方法使用new操作符在堆上分配内存空间,并使用memcpy函数将已有的vector对象的数据复制到新的内存空间中。通过这种方式,可以实现深拷贝,即两个vector对象拥有独立的内存空间。这种方法的好处是可以在不修改原始vector对象的情况下创建一个新的vector对象。 除了以上两种方法,还可以使用其他方式实现vector类。例如,可以使用动态数组来实现vector的底层数据结构,然后通过成员函数实现vector的各种操作,如增加、删除、查找等。 总结来说,c语言模拟实现vector的关键是动态内存管理和对元素的增删改查操作。可以使用预留空间和逐个添加元素的方式,也可以使用动态数组和复制数据的方式来实现vector类。具体的实现方式可以根据需求和实际情况选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++——vector模拟实现](https://blog.csdn.net/weixin_49449676/article/details/126813526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值