首先聲明,下面的講解都是針對GCC2.9,std::alloc
通過下面的源代碼大家可以看到list類的內部成員是一個node,而他的類型是linktype,前面的typedef里面有介紹是一個指針,所以,當我們創建一個對象的時候,他的大小是4,只有一個指針,而listnode是一個結構體,void *的兩個指針,因為list是一個雙向鏈表,而且還是一個環狀的,所有有兩個指針
iterrator:我們如何查看list里面的元素呢,我們需要使用iterator迭代器,我們說迭代器是一個指針,那他到底是什么指針,除了vector和arrar,(因為他們兩個的內存空間是連續的),其他的序列式容器的迭代器都是一個類類型的,因為list的各個元素相互·1獨立,他們不能通過單存的++就可以實現地址的++進而取得元素,相反,他們內部需要進行某些處理獲得下一個元素的位置,所以我們看到第二張圖片(*node).mext,在++的重載函數里面,他首先獲得里面的next,在跳轉到下一個元素返回
前置版本返回一個引用【Fraction& operator++()】,后置版本返回一個const值【const Fraction operator ++(int)】。
后置版本是利用前置版本來實現的。節約代碼,控制代碼有余。
前置版本的效率高,因為后置版本需要調用前置版本,所有后置版本效率比前置要低。(++i比i++效率高。)
在后置版本里,人為添加一個參數(int),主要是為了區別前置版本,這個參數不會被使用。
他們的返回值一個是&,一個是非引用,
下滿舉一個例子
++++i
i++++
上面兩個都執行兩次++,但是前置的可以,后置的就不可以,所以,為了滿足上面的這種要求,前置的要求返回引用,后置的不能返回引用,就可以解決是否可以前置后置兩次++的問題了
***************************G4.9***********************************************
下面就是兩者的主要區別list_iterator傳的參數變了,省去了沒有必要的引用和指針,list_node結構變了,之前point和data封裝在一起,現在單獨開了,
以前l2.9,空list對象4個字節,現在8個,可以看一下上面的結構,list為空。但是繼承了listbase,listbase包含了listimpl,listimpl又包含了list_node_base,里面有兩個指針,所以大小為8