[問題] List<T>底層是怎麼實作的?

看板C_Sharp (C#)作者 (DoubleLight)時間11年前 (2014/08/16 13:41), 11年前編輯推噓0(1111)
留言13則, 5人參與, 最新討論串1/1
最近在幫朋友解C++的問題,常常動不動就手癢用LinkedList存東西 應該是C#的List<T>太方便,用太多的後遺症 但是C++的東西都要自己親自寫(我知道是有套件,但是用起來也是麻煩,乾脆自己寫) 辛苦實作之餘,我不禁想了想,C#的List<T>底層到底都是怎麼實作的呢? 從資料結構的課程來分析, 資料存放的方式有兩大種,陣列和串列, 陣列的優點是存取各項目非常方便迅速,缺點則是增減項目非常麻煩, 串列則剛好顛倒過來 而List<T>可以用像陣列一樣直接用index存取每個項目, 但增刪項目似乎也只需要簡單的調用方法就好(Add、Remove) 整個看起來就是Magic (?) 不過看過MSDN之後,發現List<T>好像來源跟ArrayList差不多, 所以List<T>是基於陣列的架構下實作的結構嗎? 那又是怎麼克服增刪項目的困難呢? (莫非看起來很簡單的方法,底層其實是一堆髒碼嗎?) 因為實在想不明白,就上來問問各位前輩 -- 我覺得C#是世界上最強的語言了 紅膠咖咖希希▁▁▁▁ 其他的應該廢除 寶水啡啡嘉 ██ - □–□ 如果各位有興趣的話,可以現在開始學 但是要安裝VisualStudio       因為我們只會支援精英IDE,絕對不會接受垃圾 ψ /◣– /█◣ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.171.245.175 ※ 文章網址: http://www.ptt.cc/bbs/C_Sharp/M.1408167686.A.7BB.html ※ 編輯: stu87616 (1.171.245.175), 08/16/2014 13:42:05

08/16 14:49, , 1F
用array做的,空間不夠就重新allocate新array
08/16 14:49, 1F

08/16 14:49, , 2F
List<T>就是ArrayList的generic版啊
08/16 14:49, 2F
那如果只是刪除中間幾個項目,或是要插入呢? 難道會把插入點之後的項目都進行搬移嗎?

08/16 14:51, , 3F
C++也不用自己寫啊,用vector就好
08/16 14:51, 3F
就是單純很懶... ※ 編輯: stu87616 (1.171.245.175), 08/16/2014 14:55:41

08/16 14:57, , 4F
沒錯List插入就會把後面的都往後搬,所以要O(n)
08/16 14:57, 4F

08/16 14:59, , 5F
所以通常用List是不太會去用指定index的方法
08/16 14:59, 5F

08/16 14:59, , 6F
的insert/remove
08/16 14:59, 6F
顆顆我還蠻常用的說,看來以後要注意一下了 ※ 編輯: stu87616 (1.171.245.175), 08/16/2014 15:07:59

08/16 15:34, , 7F
FWIW, C# 有 LinkedList, 請在合適時選用
08/16 15:34, 7F

08/16 18:08, , 8F
c++明明就有list<T> 跟懶有甚麼關係
08/16 18:08, 8F
抱歉 我承認我的確只是稍微看一下文件覺得太麻煩就直接自己硬幹了 不過本文的主題還是想問C#的部分啦 如有冒犯還請海涵 ※ 編輯: stu87616 (1.162.160.250), 08/16/2014 19:06:12

08/16 20:35, , 9F
都叫做 List,怎麼還會跟 Array 扯上關係!
08/16 20:35, 9F

08/17 02:16, , 10F
直接看 .NET Framework 的 source code 吧!
08/17 02:16, 10F

08/17 02:17, , 11F
08/17 02:17, 11F

08/17 02:18, , 12F
Purpose: Implements a generic, dynamically
08/17 02:18, 12F

08/17 02:19, , 13F
sized list as an array.
08/17 02:19, 13F
文章代碼(AID): #1Jxky6Ux (C_Sharp)
文章代碼(AID): #1Jxky6Ux (C_Sharp)