STL源码剖析(8):list双向链表及其与STL整体架构

本文详细介绍了C++标准模板库(STL)中的list容器。包括list的双向链表特性、节点(node)和迭代器(iterator)的实现原理,以及list如何进行元素插入、删除等操作。此外还介绍了list与STL算法的配合使用。

STL分成六大部分:容器(container)、算法(algorithm),迭代器(iterator)、配接器(adapter)、仿函数(functor)、配置器(allocator)

此处先来介绍一下list(双向链表)

list

相较于vector的连续线性空间,list就显得复杂很多,他的好处是每次插入或删除一个元素,就配置一个元素空间,因此,list对于空间的运用有绝对的精准,一点也不浪费,而且,对于任何位置的元素插入或删除,list永远是常数时间。

引入标准库(standard library)文件

#include <list>

node:list的节点

鉴于链表的独特性,其在内存空间是一种线性结构,是链式存储结构,因此就会存在节点(node)的定义

template <class T>		// list数据类型
struct __list_node {
   
   
	typedef void* void_pointer;
	void_pointer prev;		// 前指针
	void_pointer next;		// 后指针
	T data;		// 数据域
};

iterator:list的迭代器

list的迭代器不能像vector一样以普通指针为迭代器,其行动时应该指向的是节点。而其具有前移、后移的能力,因此list提供的是bidirectional iterator(双向迭代器)

// T 数据类型
// Ref 引用
// Ptr 指针
template <class T, class Ref, class Ptr>
struct __list_iterator {
   
   
	typedef __list_iterator<T, T&, T*> iterator;
	typedef __list_iterator<T, Ref, Ptr> self;
	// 重命名迭代器
	typedef bidirectional_iterator_tag iterator_category;
	// 重命名数据
	typedef T value_type;
	typedef Ref reference;
	typedef Ptr pointer;
	// 重命名节点
	typedef __list_node<T>* link_type;
	typedef size_t size_type;
	typedef ptrdiff_t difference_type;
	
	// 节点,注意节点是一个结构体指针
	link_type node;
	
	// 构造节点
	__list_iterator(link_type x): node(x) {
   
   }
	__list_iterator() {
   
   }
	// 构造节点的数据域
	__list_iterator(const iterator& x): node(x.node) {
   
   }
	
	bool operator==(const self& x)const {
   
   return node==x.node};
	bool operator!=(const self& x)const {
   
   return node!=x.node};
	// 对迭代器取值
	reference operator*()const {
   
   return (*node).data;}

	pointer operator->()const {
   
   return &(operator*());}
	// 对迭代器累加1,前进一个节点,前置递增
	slef& operator++() {
   
   
		node = (link_type)((*node).next);
		return *this;
	}
	// 对迭代器递减1,后退一个节点,前置递减
	slef& operator--() {
   
   
		node = (link_type)((*node).prev);
		return *this;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

妖怪喜欢风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值