
一.介紹list同vector一樣都是容器list底層雙向循環鏈表由前驅指針、后繼指針和數據組成與vector不同于不是連續內存vector是連續數組。優點任意位置插入刪除元素時間復雜度為O1erase刪除時僅僅被刪除的節點迭代器失效其余迭代器依舊有效缺點不支持下標訪問遍歷效率低二.list實現1.list構造函數2.list iterator此處begin和end為正向迭代器反向還莫有學可進行操作迭代器向后移。swap交換先給自己一個頭指針再把需要交換的頭指針給 給創建好的頭指針再把臨時對象tmp的新頭指針給原來的完成交換。為什么會有list類和list iterator類list容器管整塊鏈表數據迭代器iterator專門管單個節點的訪問、遍歷分工完全不一樣必須拆成兩個類后者掌管1. 重載 * 解引用 *it 取出節點里存儲的數據T2. 重載 前置/后置自增 it 跳到下一個節點 _pNode _pNode-_pNext3. 重載 -- 自減往前遍歷上一個節點4. 重載 ! 判斷兩個迭代器是否指向同一個節點為什么要重載--相較于vector它空間是連續的1. vector迭代器本質就是封裝的原生T*指針vector內存連續原生指針天然支持 、 -- 、 n 、 [] 隨機偏移指針自增直接跳到下一個相鄰元素。所以不用手動重載 operator 、 operator-- 直接復用原生指針自帶的運算規則即可。2. list不能用裸指針做迭代器必須手動重載所有運算符list節點零散分布在堆上前后節點內存地址并不挨著。單純對節點Node*做 只會走到這塊內存后面隨機地址找不到下一個鏈表節點。只能手動寫重載一、為啥三個模板參數1. T 鏈表存的數據類型2. Ref 引用、 Ptr 指針用來一套代碼做出兩種迭代器- 普通迭代器 RefT、PtrT* 能讀寫數據- const迭代器 Refconst T、Ptrconst T* 只能讀不能改不用寫兩份重復代碼省事。3. Self 給自己這個迭代器類起短別名少寫長名字。二、各個函數為啥對應不同類型1. Ref operator*() 解引用取值用Ref控制能不能修改元素2. Ptr operator-() 箭頭訪問成員用Ptr控制讀寫權限3. 拷貝構造、運算符用 Self 指代迭代器本身類型書寫簡單方便鏈式運總代碼