stl之list

list结构

内存大小

list里存放的数据就一个node,为link_node类型,最终是个指针,为4字节,所以list的sizeof为4
我们可以看到__list_node结构体,它是双向链表(记得要前闭后开,所以要在最后留一空白节点),里面存放数据data,但是可以看到它前后指针类型是void*,这个其实是不太理想的,后续需要进行转型操作,后在G4.9版改进了

list iterator设计


iterator必然是个class,是智能指针,里面有大量的操作符重载,指针需要*、->、++、--、+=等操作


注意:iterator都需要有5个typedef,分别为iterator_category、value_type、pointer、reference、link_type、different_type

还有一些操作符function:++、--等


操作符++

++有i++和++i这两种方式,为了区分,规定++i没有参数,i变成调用++函数的对象了;i++有参数但是没有实际意义

我们也可以看到前后++的类型不一样,前++是引用,这是因为++操作符致敬整形++操作符,后++不能加2次,例如i++++,这样在第一次++后返回的是非iterator即指针、地址;而前++可以,例如++++i等价于++(++i)


在list中,++i就取node的next就行,记得转型,--类似


i++,需要注意它在进行操作的时候,有些操作符是已经被重载了的,例如tmp = this,是被重载了的,但是编译器先遇到=,=也被重载了,所以*this就变成了重载的=的参数,后面2的也类似

提取值

就是直接取data,那就是先取node的对象即node,再取data
->就是 还不太理解

G4.9对G2.9版本的改进

1.__list_iterator<T, T&, T*>
这里iterator要绑定3个参数,实际只要一个就好了,另外2个给&和在类里也可以直接写
2.在__list_node类里,前后指针用的void
问题,在G4.9版本进行了改进

posted @ 2023-02-24 10:10  acwarming  阅读(32)  评论(0编辑  收藏  举报