C++ STL->list模拟实现


theme: smartblue

list
list文档

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。
  3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。
  4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。
    5.与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)

list类的函数接口

namespace ding
{
   
   
	//结点类
	template<class T>
	struct _list_node
	{
   
   
         //构造函数
		_list_node(const T& val = T());

		T _data;                 
		_list_node<T>* _next;   
		_list_node<T>* _prev;   
	};
	//迭代器类
	template<class T, class Ref, class Ptr>
	struct _list_iterator
	{
   
   
		typedef _list_node<T> node;
		typedef _list_iterator<T, Ref, Ptr> self;
		//构造函数
		_list_iterator(node* pnode);  

		
		self operator++();
		self operator--();
		self operator++(int);
		self operator--(int);
		bool operator==(const self& s) const;
		bool operator!=(const self& s) const;
		Ref operator*();
		Ptr operator->();

		//成员变量
		node* _pnode;
	};

	//list类
	template<class T>
	class list
	{
   
   
	public:
		typedef _list_node<T> node;
		typedef _list_iterator<T, T&, T*> iterator;
		typedef _list_iterator<T, const T&, const T*> const_iterator;

		//Member functions
		list();
		list(const list<T>& lt);
		list<T>& operator=(const list<T>& lt);
		~list();

		//Iterators:
		iterator begin();
		iterator end();
		const_iterator begin() const;
		const_iterator end() const;

		//Element access:
		T& front();
		T& back();
		const T& front() const;
		const T& back(
题目:新建链表-头插+尾插法 描述: 头插+尾插法建立单链表 【问题描述】 小明尝试用头插法和尾插法建立一个单链表,从空表开始, 他每次输入两个整数 p,q,其中 p 是插入的类型(1 表示头插法,2 表示尾插法),q 是插入的元素。 例如假设单链表 t 最初为空,即[], 若用户输入 1 5 ,表示用头插法插入元素5, 则单链表 t 的内容为 [5] 请编写C++程序实现上述过程。 【输入格式】 用户输入若干行, 每一行有两个格式: 如果包含两个整数p,q,用空格分隔,则 p=1 表示头插法,p=2 表示尾插法插入元素q; 如果只包含一个整数p, 且p不是1或者2,则表示插入操作结束。 【输出格式】 每一次插入操作后,打印当前单链表的内容,例如: [->5->6->8] 单链表的内容用[]包裹,每个元素之前用->表示链。 【样例输入】 1 5 2 8 1 6 0 【样例输出】 [->5] [->5->8] [->6->5->8] 【样例输入】 1 9 2 8 1 7 2 6 2 5 1 10 1 4 2 3 2 2 1 1 1 10 2 11 -1 【样例输出】 [->9] [->9->8] [->7->9->8] [->7->9->8->6] [->7->9->8->6->5] [->10->7->9->8->6->5] [->4->10->7->9->8->6->5] [->4->10->7->9->8->6->5->3] [->4->10->7->9->8->6->5->3->2] [->1->4->10->7->9->8->6->5->3->2] [->10->1->4->10->7->9->8->6->5->3->2] [->10->1->4->10->7->9->8->6->5->3->2->11] 【样例输入】 2 4 1 3 1 6 1 1 2 5 1 2 3 【样例输出】 [->4] [->3->4] [->6->3->4] [->1->6->3->4] [->1->6->3->4->5] [->2->1->6->3->4->5]
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++下等马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值