昨天因为有点晚,忘记更新昨日所学
昨天主要完成了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,但不能完全替代,因为他的随机访问效率极低。