分別可以從vector
和array
包得到one-bool-per-byte和one-bool-per-bit選項。
首先,Data.Vector.Unboxed
的Vector Bool
使用一個字節數組,每Bool
一個字節。
newtype instance Vector Bool = V_Bool (P.Vector Word8)
以及獲取和設置通過功能介導的:這可以從在模塊Data.Vector.Unboxed.Base
源其中Vector Bool
被定義爲覈實
fromBool :: Bool -> Word8
toBool :: Word8 -> Bool
可替代地,它可以直接由仿形的驗證程序:
import Data.Vector.Unboxed as V
main = let v = V.replicate 1000000000 True
in print (v ! 5)
並觀察到它分配的只是超過1,000,000,000字節。
其次,的UArray Int Bool
被實現爲位向量,每位有一個Bool
。該有關人士是在Data.Array.Base
,在那裏你可以看到在實例中使用的位操作:
instance IArray UArray Bool where
...
unsafeAt (UArray _ _ _ arr#) (I# i#) = isTrue#
((indexWordArray# arr# (bOOL_INDEX i#) `and#` bOOL_BIT i#)
`neWord#` int2Word# 0#)
同樣,這可以直接通過分析證實:
import Data.Array.Unboxed as A
main = let v = A.listArray (1,1000000000) (repeat True) :: UArray Int Bool
in print (v ! 5)
,並驗證其分配大約125,000,000字節。
你需要什麼'Vector'的功能? –
@WillemVanOnsem標準的Haskell List原語(即map,fold,filter等)我也使用'V.generate'來讀取文件中的所有樣本。 –
C++標準庫包含[bool的模板專門化](http://en.cppreference.com/w/cpp/container/vector_bool),它使用字節的全部內容來提高空間效率......但是, [現在被廣泛認爲是一個壞主意](https://isocpp.org/blog/2012/11/on-vectorbool)。對於這樣的向量,性能往往會受到很大的影響,因爲元素訪問不能直接用指針算術來執行。 - 如果只想有效地表示連續信號的符號,則應考慮只存儲符號變化處的_點。 – leftaroundabout