昨天因为有点晚,忘记更新昨日所学

昨天主要完成了list的使用以及底层实现》

list是针对vector的不能在头插以及中间位置插和扩容代价大的缺点而衍生出来的,它的出现是为了弥补vector的缺点,但是他也有自己的缺点,就是不能operator[]随机访问。因它是带头双向循环链表。

它的底层实现主要由是由节点类,迭代器类,链表类3部分实现。节点类主要包含了prev,next  data,其是一个模板类,因为节点值类型不知。

并且申请一个新节点的时候,应该初始化,所以其有构造函数;迭代器类主要是由一个节点来重载*、++、--等运算符进而实现迭代器具有指针的功能,他也是一个模板类,因为迭代器包括普通迭代器和const迭代器,通过模板类传参可以实现不同迭代器。

链表类也是一个模板类,因为节点类型不知道。并且其内部只有一个头指针,指向头结点。

最后注意:

指针和迭代器区别

当他们指向同一块地址的时候,那么在物理内存中,他们都存储的是这个节点的地址,物理上是一样的,但是他们类型不一样,也就决定了他们的意义不一样:比喻*cur得到为节点的值,而*it是调用operator*,返回的是节点中存储的值。


list和vector的区别

vector是动态增长的数组;优点是:随机访问-》operator[]

缺点是:头部以及中间插入效率极低。并且扩容代价极大。

list是双向循环链表

优点:任意位置的插入删除效率高。

缺点:不能随机访问

今天主要学习了stack和queue的使用,并了解了什么是容器适配器,其实就是容器实现转换的,默认情况下为deque,

deque(双端队列)主要集中了list和vector的优点,具有operator[]访问和头尾插入删除等优点,一定程度上可以替代list和queue,但不能完全替代,因为他的随机访问效率极低。