2010-06-29 18 views
0

我已經開始做我自己的「數組結構」編碼,但想知道是否有人知道庫或模板已經在那裏做強烈的數據轉換的東西在內存受限的硬件上。有沒有在C++中的內存操作的任何表lib /代碼

我想我正在尋找的是一種「內存」容器,它允許我排隊插入直到同步點,並在中期迭代「刪除」。它不必是一個實際的刪除(與移動東西的開銷),標記爲刪除也可以。 此外,容器將可能必須連續的大部分出於性能的考慮,緩存變暖等。連續的塊不是完全連續的,也可以,但是基於鏈表的容器不會因內存或速度而減少,因爲數組通常由非常小的元素組成。

這就是爲什麼我假設某種表類將適合,因爲容器就像一個按主鍵排序的表。

雖然很好的意思,但使用std :: vector的想法並不是真的可能,因爲在迭代過程中刪除了一些東西,會導致訪問數組末尾的數據和開始的數據(count) 。

此外,沒有理由不止一個迭代器不能在相同的數據上運行,因此,像swap一樣刪除會導致其他迭代器跳過某些元素。這就是爲什麼我提到排隊插入。

插入和刪除操作會更改容器的形狀,所以我假設可以通過同步操作來處理它們,但插入刪除操作可能會在當前內容的迭代過程中排隊。

+0

「將搞砸了緩存「 - >你有沒有實際分析過這個並測量了顯着的影響? – fredoverflow 2010-06-29 16:27:31

+0

如果你把它排除在外,它需要大約500個週期才能加載到數組的末尾,你必須從前面查找它的距離(通過獲取當前的矢量大小),而且這也是即使您沒有真正交換,也會在開始處寫入數據,但您仍然需要編寫新的數據大小。如果你保持「緩存」的大小,那麼你停止多個迭代器一次工作。 – 2010-06-30 10:44:05

回答

3

和中期迭代「刪除」。它不必是一個實際的刪除

可以使用std::vector,但不是在中間擦除,你只是換用了最後一個元素,然後擦除:

#include <algorithm> 

template <typename T> 
void cheap_erase(std::vector<T>& vec, size_t index) 
{ 
    using std::swap; 
    swap(vec[index], vec.back()); 
    vec.pop_back(); 
} 
+0

這可能是'swap(vec [index],vec.back()); vec.pop_back();'以避免與迭代器混亂。 – 2010-06-29 10:45:23

+0

@Mike:謝謝,修正。 – fredoverflow 2010-06-29 11:38:33

相關問題