STL库 中list vector的模拟实现

list就是一个双向链表 可以o(1)的插入删除操作 但查找数据需要遍历 o(n)
vector因为存储空间是连续的 所以可以使用下标来访问

构造函数
list和vector 都有 无参构造 拷贝构造 n个相同的值构造 一段迭代器区间构造
迭代器
list和vector 都有 正向反向 const
其他成员函数
都有增删改查 判空 swap clear
其中 vector空间不是一个一个增加的 会预先开一部分空间 所以多一个reserve函数 如果知道容量可以直接设置 避免频繁异地扩容
这些都很好实现
其中反向迭代器可以巧妙地复用正向迭代器

template<class Iterator, class ref, class ptr>
	class reverse_Iterator
	{
	public:
		typedef reverse_Iterator self;


		reverse_Iterator(Iterator _it)
			:it(_it)
		{}


		ref operator*()
		{
			Iterator tmp = it;
			return  *(--tmp);
		}


		ptr operator->()
		{
			Iterator tmp = it;
			return &((--tmp)->data);
		}


		self& operator++()
		{
			--it;
			return *this;
		}


		self& operator--()
		{
			++it;
			return *this;
		}


		self operator++(int)
		{
			iterator tmp = it;
			--it;
			return tmp;
		}


		self operator--(int)
		{
			iterator tmp = it;
			++it;
			return tmp;
		}


		bool operator==(const self& x)
		{
			return it == x.it;
		}


		bool operator!=(const self& x)
		{
			return !(*this == x);
		}


	private:
		Iterator it;
	};

只要你传的是list正向迭代器 它就是list反向迭代器 传vector正向迭代器 它就是vector的反向迭代器

迭代器失效问题
在vector的删除中 你当前某个位置的迭代器传入erase后 删除元素 当前迭代器指向的位置的元素已经变成了删除元素的下一个元素 这个迭代器就失效了
在inster中如果发生了异地扩容 这个迭代器也会失效 变成一个野指针
迭代器失效的场景有很多
list中也有诸多类似问题 需要注意
有些情况 如erase 会返回下一个元素的迭代器 可以在删除以后接受以更新这个迭代器

list模拟实现
vector模拟实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值