C++ 【list,priority_queue模拟实现】

本文详细介绍了C++中`list`的数据结构和迭代器框架,包括迭代器的运算符重载、拷贝构造和赋值运算符等。此外,还探讨了`priority_queue`的使用,包括`push`、`pop`操作,以及如何通过仿函数控制小根堆。文章强调了`list`在插入和删除操作上的优势,以及在迭代器失效情况下的处理策略。
摘要由CSDN通过智能技术生成

目录

1.list注意事项:

2. list迭代器框架

2.1 operator==  != 运算符重载

2.2 operator* 运算符重载

2.3 operator-> 运算符重载

2.4 拷贝构造

2.5 赋值运算符重载

2.6 析构+clear

3. const迭代器

insert && push_back && push_front

erase && pop_back && pop_front

反向迭代器

三种类型迭代器

5.priority_queue

push

pop

迭代器区间构造

仿函数


1.list注意事项:

1.list允许在任意位置常数时间O(1)插入删除,是带头双向循环列表

2.list的insert不会造成迭代器失效,只改变链接关系;erase造成迭代器失效,需要接收返回值(指向下一个节点)

3.begin在哨兵位next,end在哨兵位

4.list新增Operations

splice:把链表数据转移到另一个链表中

remove:等于find+erase,删除某个元素全部数据

remove_if:配合仿函数条件删除

unique:去重,前提排序

merge:两个链表归并到一起,取小的尾插

sort归并:仅支持list,算法库sort前提要求物理空间连续(快排三数取中)

reverse: 逆置

2. list迭代器框架

list_node

1.节点值_val,指向前一个节点的指针_prev,指向后一个节点的指针_next 

2.构造函数初始化

__list_iterator

1.拿到对应结点,进行++迭代器操作

namespace Mylist
{
	template<class T>
	struct list_node
	{
		T _data;
		list_node<T>* _next;
		list_node<T>* _prev;

		list_node(const T& x = T())//提供缺省值
			:_data(x)
			,_next(nullptr)
			,_prev(nullptr)
		{}
	};

	template<class T>
	struct __list_iterator//提供一个节点,进行迭代器操作
	{
		typedef list_node<T> Node;
		typedef __list_iterator<T> iterator;
		Node* _node;

		__list_iterator(Node* node)//构造函数
			:_node(node)
		{}

        //...
		iterator operator++()
		{}
	};

	template<class T>
	class list
	{
		typedef list_node<T> Node;
	public:
		typedef __list_iterator<T> iterator;

		iterator begin()
		{
			return iterator(_head->_next);//匿名对象
		}

		iterator end()
		{
			return iterator(_head);//匿名对象
		}

		list() 
		{
			_head = new Node;
			_head->_next = _head;
			_head->_prev = _head;
		}

	private:
		Node* _head;//哨兵位头结点
	};

}

由于节点的指针原生行为不满足迭代器定义,在这里,迭代器通过类来封装节点的指针重载运算符,如operator*、operator->、等

2.1 operator==  != 运算符重载

		bool operator!=(const iterator& it) const //判断节点指针是否相等
		{
			return _node != it._node;
		}

		bool operator==(const iterator& it) const //判断节点指针是否相等
		{
			return _node == it._node;
		}

2.2 operator* 运算符重载

	T& operator*()//可以修改
		{
			return _node->_data;
		}

2.3 operator-> 运算符重载

编译器进行特殊处理,实际上是两个箭头

	T& operator->()
		{
			return &(operator*());
		}

2.4 拷贝构造

range(3):迭代器区间构造

用模板迭代器区间构造,好处是可以用任意类型迭代器区间来构造

        void empty_init()//创建并初始化哨兵位头结点 
		{
			_head = new Node;
			_head->_next = _head;
			_head->_prev = _head;
		}

		list()
		{
			empty_init();
		}

		template <class InputIterator>  
		list(InputIterator first, InputIterator last)
		{
			empty_init();//需要哨兵位头结点初始化,否则崩溃
			while (first != last)
			{
				push_back
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北方留意尘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值