STL 学习总结四 —— list-链表

list-链表

list 设计

每个元素都是放在同一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问。

添加删除元素的性能很高,通常用来作随机插入和删除操作的容器

list 属于双向链表,其结点与list本身是分开设计的。

template<class T, class Alloc = alloc>
class list {
protected:
    typedef: listnode <T> listnode;
public:
    typedef: listnode link_type;
    typedef: listiterator<T, T &, T> iterator;
protected:
    link_type node;
}

学习到了一个分析方法,拿到这样一个类,先看它的数据比如上面的linktype node,然后我们再看它的前缀linktype,去上面在linktype,找到typedef list_node linktype;按这个方法继续找到上面的typedef listnode<T> listnode;我们发现listnode是下面的类,我们一层层寻找,就能看懂这些源码:

template<class T>
struct _listnode {
    typedef void voidpointer;
    voidpointer prev;
    voidpointer next;
    T data;
}

list 是一个环状的双向链表,同时它也满足STL对于“前闭后开”的原则,即在链表尾端可以加上空白节点。

list迭代器的设计:

迭代器是繁华的指针,所以里面重载了->, --, ++, *, ()等运算符,同时迭代器是算法与容器之间的桥梁,算法需要了解容器的方方面面,于是就诞生了5种关联类型(这5种是必须的,可能还需要其他的类型)。我们知道算法传入的是迭代器或者指针,算法根据传入的迭代器或指针推断出算法所想要的了解的容器里的5种关联类型的相关信息。由于只传入指针,算法推断不出来想要的信息,所以我们需要一个中间商(萃取器),也就是我们所说的iterator traits类,对于一般的得带器,它直接提供迭代器里的关联类型值,而对于指针和常量指针,它采用的类模板偏特化,从而提供其所需要的关联类型的值。

萃取器:图片来源于代码随想录

// 针对⼀般的迭代器类型,直接取迭代器内定义的关联类型
template<class I>
struct iterator_traits {
	typedef typename I::iteratorcategory iteratorcategory;
	typedef typename I::valuetype valuetype;
	typedef typename I::differencetype differencetype;
	typedef typename I::pointer pointer;
	typedef typename I::reference reference;
};
//• 针对指针类型进⾏特化,指定关联类型的值
template<class T>
struct iteratortraits<T> {
	typedef randomaccessiteratortag iteratorcategory;
	typedef T value_type;
	typedef ptrdifft differencetype;
	typedef T *pointer;
	typedef T &reference;
};
//• 针对指针常量类型进⾏特化,指定关联类型的值
template<class T>
struct iteratortraits<const T> {
	typedef randomaccessiteratortag iteratorcategory;
	typedef T valuetype; // valuetye被⽤于创建变量,为灵活起⻅,取 T ⽽⾮ const T 作为value_type
	typedef ptrdifft differencetype;
	typedef const T *pointer;
    typedef const T &reference;
};

vector 和 list的区别

  1. 底层现实不同:vector底层实现是数组,list是双向链表;
  2. vector是顺序内存,支持随机访问,list是链表,不支持随机访问;
  3. vector 在中间节点进行插入、删除会导致内存拷贝,list不会;
  4. vector一次性分配好内存,内存不够再进行扩容;list每次插入新节点都会申请新内存;
  5. vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

L☆★

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

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

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

打赏作者

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

抵扣说明:

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

余额充值