2015-08-24 29 views
3

當我試圖練習一些基本的數據結構,如鏈接/雙向鏈接/回收鏈接/回收雙鏈表,AVL樹,紅黑樹, B-Tree和Treap通過在Swift 2中實現它們,我決定利用Swift 2的新特性來做這樣的事情:間接枚舉,因爲枚舉使空節點和填充節點比類更具語義。間接枚舉或類,我應該使用哪一個來構建基本數據結構

但很快就發現,對於非循環鏈接列表,插入元素後返回插入節點沒有意義,因爲返回的值是值類型而不是引用類型。據說您不能通過將信息直接寫入返回值來加速下一次插入,因爲它是插入節點的副本,但不是對插入節點的引用。

更糟糕的是,改變基於間接枚舉的節點意味着編寫關聯值的所有數據,這明確引入了不必要的系統資源消耗,因爲每個枚舉情況下的關聯值本質上都是一個元組,本質上是內存中的一種連續數據,這與結構相同,但不具有每個屬性訪問器來實現小批量數據寫入。

那麼我應該使用哪一個來構建這樣的基本數據結構呢?間接枚舉或類?

回答

0

那麼無論它是快1還是快2原因目前EnumStructures都是value類型,而Classes是通過引用來調用。既然你想在你的代碼中使用數據結構,並且像你自己調用它一樣,那麼通過值來調用它們並不好。您必須使用Class才能使您的代碼執行您想要的操作。這裏是一個Class使用鏈表的例子:

 class LLNode<T> 
    { 
    var key: T? var next: LLNode? var previous: LLNode? 
    } 

      //key printing 
     func printAllKeys() 
    { 
    var current: LLNode! = head; //assign the next instance 
    while(current != nil) 
    { 
    println("link item is: \(current.key)") 
    current = current.next 
    } 
    } 

public class LinkedList<T: Equatable> 
{ //create a new LLNode instance private 
var head: LLNode<T> = LLNode<T>() //append a new item to a linked list 
func addLink(key: T) 
{ //establish the head node 
if (head.key == nil) 
{ 
head.key = key; 
return; 
} //establish the iteration variables 
var current: LLNode? = head 
while (current != nil) 
{ 
if (current?.next == nil) 
{ 
var childToUse: LLNode = LLNode<T>() 
childToUse.key = key; 
childToUse.previous = current 
current!.next = childToUse; 
break; 
} 
current = current?.next 
} //end while 
} ///end function 

使用SWIFT和數據結構請不要訪問更多的例子: data structures swift

結論:使用Class如果你想通過參考其他人使用調用EnumStruct

相關問題