2013-07-18 40 views
2

我在我的應用程序中遇到了一個需要雙向字典數據結構的案例,這意味着一種NSDictionary,您可以通過一個鍵(所有值和鍵都是唯一的)檢索具有值和值的鍵。bidict結構的可用性?

C/ObjectiveC中有這樣的數據結構嗎?

+1

除非我誤解,只需將k => v和v => k添加到同一個NSDictionary中即可解決問題......? –

+0

您在C#中談論哪個bidictionary? (它不在C#本身,因爲這只是一種語言 - 但我不知道.NET框架中的雙向字典。) –

+0

總是很高興地看到iOS主題上的@JonSkeet。 – Peres

回答

3

您可以用NSDictionary做到這一點:

allKeysForObject:返回一個包含對應於字典中的給定對象的所有出現的鍵 一個新的陣列。

  • (NSArray *)allKeysForObject:(id)anObject參數anObject在字典中查找的值。返回值包含與 字典中出現的所有對象相對應的鍵的新數組 。如果未找到匹配anObject的對象,則返回空數組。

討論字典中的每個對象都會發送isEqual:消息 以確定它是否等於anObject。

和:

objectForKey:返回與給定鍵關聯的值。

  • (id)objectForKey:(id)aKey參數aKey返回相應值的鍵。返回值與 aKey關聯的值,如果沒有值與aKey關聯,則返回nil。
+0

這種方法的問題是次優時間複雜性 - 這是線性的。對於大容器,性能可能會變得太糟糕。Cocoa框架沒有一個具有常數或對數時間複雜度的「雙向」容器(boost有一個[Bimap](http://www.boost.org/doc/libs/1_54_0/libs/bimap/doc/html/index的.html))。 – CouchDeveloper

+0

由開發者決定是否值得使用。 – Peres

+0

的確如此。對於少數元素(比如少於幾百個元素)的用例,這可能不會影響整體性能。 – CouchDeveloper

1

從字面上看,答案是否定的

正如你可以創建用於管理兩個字典一個輔助類解決方法。

另一種方法是圍繞C++容器創建一個薄包裝,它實現了這個:boost的Bimap

當在C++容器中使用ARC和Objective-C對象作爲值或鍵時,它們將很好地處理NSObject。也就是說,他們會像您所期望的那樣處理內存管理 - 而且您甚至可以免費獲得「異常安全」。另外,C++標準容器也更快一點,使用更少的內存,並提供更多的優化選項(例如自定義分配器)。