2013-04-28 83 views
0

我試圖將數據插入B樹的葉節點(數組)。這裏是我到目前爲止的代碼:C++將數據插入(並將其移入)數組

void LeafNode::insertCorrectPosLeaf(int num) 
{ 
    for (int pos=count; pos>=0; pos--) // goes through values in leaf node 
    { 
    if (num < values[pos-1]) // if inserting num < previous value in leaf node 
    {continue;}     // conitnue searching for correct place 
    else      // if inserting num >= previous value in leaf node 
    { 
     values[pos] = num;  // inserts in position 
     break; 
    }    
    } 
    count++; 
} // insertCorrectPos() 

行前值[POS] = NUM​​,我認爲需要編寫一些代碼,而不是轉移覆蓋它的現有數據。我試圖使用memmove,但有一個問題。其第三個參數是要複製的字節數。如果我在64位機器上移動一個int,這是否意味着我會在這裏放置一個「4」?如果我對這個完全錯誤的任何幫助將不勝感激。謝謝

+0

如果數據是[std :: vector <>](http://en.cppreference.com/w/cpp/container/vector),[std :: deque <>](http: //en.cppreference.com/w/cpp/container/deque)或[std :: list <>](http://en.cppreference.com/w/cpp/container/list),只需使用迭代器找到正確的插槽,然後使用[insert()](http://en.cppreference.com/w/cpp/container/vector/insert)。複印等,都將爲您照顧。 – WhozCraig 2013-04-28 04:08:54

+0

數據位於數組中。 – sbru 2013-04-28 04:10:55

回答

1

最簡單的方法(也許是最有效的)將是使用標準庫預定義結構之一來實現「值」。我建議listvector。這是因爲列表和矢量都有一個插入函數可以幫你。我特別建議vector類是因爲它具有與數組相同類型的接口。但是,如果您想專門針對此操作的速度進行優化,那麼我會建議列表類,因爲它實施的方式。

如果你寧可給它的硬盤的方式,那麼在這裏去... 首先,你需要確保你有空間的工作,你可以動態地分配:

int *values = new int[size]; 

或靜態

int values[MAX_SIZE]; 

如果分配的靜態,那麼你需要確保MAX_SIZE是,你永遠不會超過一些巨大的價值。此外,每次添加元素時,都需要根據分配的空間量檢查數組的實際大小。

if (size < MAX_SIZE-1) 
{ 
    // add an element 
    size++; 
} 

如果您動態分配,那麼每次添加元素時都需要重新分配整個數組。

int *temp = new int[size+1]; 
for (int i = 0; i < size; i++) 
    temp[i] = values[i]; 
delete [] values; 
values = temp; 
temp = NULL; 

// add the element 
size++; 

當您插入一個新值時,需要將每個值都轉換過來。

int temp = 0; 
for (i = 0; i < size+1; i++) 
{ 
    if (values[i] > num || i == size) 
    { 
     temp = values[i]; 
     values[i] = num; 
     num = temp; 
    } 
} 

請記住,這並未完全優化。一個真正神奇的實現將通過動態分配比您需要的更多空間來結合兩種分配策略,然後在空間不足時逐塊增加陣列。這正是矢量實現的功能。

列表實現使用一個鏈接列表,它具有O(1)次插入值的時間,因爲它的結構。然而,它的空間效率要低得多,並且有O(n)次訪問位置n處的元素的時間。

另外,這段代碼是在寫的時候...使用它時要小心。在最後一段代碼中可能會出現一個奇怪的邊緣情況。

乾杯! Ned

+0

感謝您的徹底!真的很感激它 – sbru 2013-04-28 04:30:05