2013-06-18 49 views
2

我正在進行一點思考實驗 - 我試圖讓我的生活更輕鬆。我正在處理一個數據結構,其中包含幾個按排序順序保存的元素數組。我將這些數據結構分配到固定大小的塊中,以便更輕鬆地放置內存,並且(在未來的時間)使穩定存儲中的讀取/寫入更加容易。這是我與迄今使用的代碼:C++:我可以使用帶有新位置的矢量嗎?

#include <limits> 

const int NODE_SIZE = 512; 

template <typename K, typename D> 
class Node { 
    long next; 
    short num; 
    K*  keys; 
    D*  data; 
public: 
    Node(int l, int order); 
}; 

// num is calculated by something like this... 
num = NODE_SIZE - sizeof(Node<K,D>) - sizeof(long); 
num /= (sizeof(D) + sizeof(K)); 

// Constructor 
//  Will be called with a placement-new and given a NODE_SIZE 
//  byte block of memory, aligned at NODE_SIZE 
template<typename K, typename D> 
Node<K,D>::Node(int n) : num (n), next(0) { 
    keys = reinterpret_cast<K*>(reinterpret_cast<char*>(&next) + 
           sizeof(*this)); 

    int numbytes = num*sizeof(K); 
    // Make sure we're aligned to a void *. 
    if (numbytes % sizeof(void *)) { 
     numbytes = (numbytes/sizeof(void *)+1)*sizeof(void *); 
    } 

    // Align to the number of bytes in a void * 
    data = reinterpret_cast<D*>(reinterpret_cast<char*>(keys)+numbytes); 

    for(int i=0; i<num; i++) keys[i] = std::numeric_limits<K>::max(); 
} 

由於關鍵是有序的元素,我真的希望能夠使用一個std :: vector和std ::矢量所以我可以使用別人的矢量插入代碼而不是自己編寫(不是很難,但爲什麼要重新發明輪子?)。

另外,有沒有一種更簡潔的方式來設置我的鍵和數據的指針?任何幫助或建議將受到歡迎。

+0

你知道分配器嗎? – Yakk

+0

我知道它們存在,但我還沒有使用它們。 –

+1

我相信你可以通過提供帶分配器的'std :: vector'來完成你想做的事情。我不確定,因爲我既不明白你在做什麼,也不完全理解分配器,但我的無知與我認爲你和分配器重疊的地方相匹配。 :) – Yakk

回答

2

您的num計算:

(NODE_SIZE - sizeof(Node<K,D>) - sizeof(long))/(sizeof(D) + sizeof(K)) 

是顯着的編譯時間常數。爲什麼不簡單地聲明:

template <typename K, typename D> 
class BpTreeNode { 
    static const std::size_t num = (NODE_SIZE - sizeof(long))/
            (sizeof(D) + sizeof(K)); 
    K keys[num]; 
    D data[num]; 
    long next; 
public: 
    Node(int l, int order); 
}; 

並讓編譯器爲您做好工作?

相關問題