2010-08-11 61 views
1

在PHP中,關聯數組保持其順序。關聯數組:PHP/C vs Flex/Flash

// this will keep its order in PHP 
a['kiwis'] 
a['bananas'] 
a['potatoes'] 
a['peaches'] 

However in Flex it doesn't with a perfectly valid explanation。我真的不記得C如何對待這個問題,但我更傾向於相信它像php一樣工作,因爲Array在內存中預先保留了空間,我們可以走內存。我對嗎?

這裏真正的問題是爲什麼。爲什麼C/PHP對此的解釋不同於Flash/Flex以及Adobe以這種方式使Flash如何工作的主要原因。

謝謝。

回答

1

對於PHP數組:這些野獸是獨特的構建體和以某種方式複雜,概述在從Kendall Hopkins一個Slashdot的響應給定的(向下滾動到他的回答):

:PHP的陣列是一個鏈式散列表(在關鍵衝突中查詢O(c)和O(n)),它允許int和string鍵。它使用兩種不同的哈希算法 將兩種類型合併到相同的哈希鍵空間中。同樣存儲在 中的每個值都被鏈接到在其之前存儲的值以及在 (鏈接列表)之後存儲的值。它還有一個臨時指針,用於保存當前項目,因此可以迭代散列。

在C/C++中,如上所述,在覈心語言中沒有「關聯數組」。它在STL中有一個映射(有序),就像在新的標準庫(hash_map, unordered_map)中一樣,並且在某些實現中有一個gnu_hash_map(無序)(這是​​非常好的imho)。

此外,在「有序」元素的「命令」 C/C++地圖通常是的「廣告訂單」(如在PHP),它是「鍵排序順序」或「串散列值排序順序「。爲了回答您的問題:您的PHP和C/C++關聯數組的等效視圖不支持,在PHP中,他們做出了設計決策,以便在單個界面下提供最大的舒適度(並且失敗或成功,無論)。在C/C++中,有許多不同的實現(有優勢和折衷)可用。

問候

RBO

2

沒有C的實現,你根據需要推出自己的產品,或從已有產品中進行選擇。因此,給定的C實現可以是有序的或無序的。

至於爲什麼,原因是優點不同。 Ordered允許你(顯然是)依賴於這個順序。但是,當你不需要訂購時,這是浪費。

不同的人會認爲排序的優勢比不排序的優勢重要或多或少。如果你還有某種有序的結構(列表,鏈接列表,矢量都可以),那麼你可以很容易地創建一個有序的散列表(而不是最優的解決方案,但很容易,所以你不能抱怨你沒有給你)。這使得它成爲從設計初期就有意爲通用目的的明顯選擇。

另一方面,排序的缺點通常只在性能方面,所以對於希望爲少數類型提供相對廣泛的支持以便新開發人員學習的人來說,它是顯而易見的選擇。

歷史的進步有時會使這些決策最優化,有時甚至是次優的,而這些方式都是開發人員無法真正計劃的。

+0

感謝清理的東西了! – Frankie 2010-08-12 00:29:40