我有一個連續的緩衝區,帶有N個記錄,每個W字節寬。 N和W在編譯時是未知的。 N * M是500mb的訂單。我想在標準STL算法中使用它,例如sort()或nth_element()。我手邊有一個比較器。有沒有已經實施的方法可以這樣做?使用void *作爲STL中的固定寬度記錄
到目前爲止,我想通2種方式:
1)使用一個額外的載體,充滿指數0,...,N,排序它(使用替代數據的自定義比較),所以它類似於有序的數據記錄,然後按照該向量移動數據記錄。缺點:額外的內存,修復數據記錄順序的額外難度,這稍微不重要。
2)創建一些自定義迭代器(知道W),它將返回一些類似於記錄的臨時「虛擬」類實例,併爲該類重載swap(),以交換內存塊。缺點:有點棘手,有些脆弱(需要遵循一些STL內部知識,如知道swap()將被使用)。
最後,我的解決方案如下:我確實創建了一個自定義迭代器,它返回「Proxy」類對象,其中包含指向該記錄的指針。我實現了swap(),並且我還實現了一個賦值構造函數/運算符。當swap()沒有被調用時,爲了擺脫賦值中的大量分配,我還實現了一個帶有原子鎖的單個靜態緩衝區(我確定在大多數情況下,1個緩衝區就足夠了)。當鎖定空閒時,使用預分配的緩衝區。當它忙時,內存像往常一樣分配。最後,在典型的使用情況下,swap()+單緩衝區減少到0。 – Codeguard 2012-08-22 11:55:08