2010-10-03 40 views
0

在我的數據結構課程中,我們正在創建一個基本的向量類。在我的頭文件中,有一個用於向矢量中插入新值的成員函數。如果我的向量容量足夠大,插入一個值,程序運行良好。但是,如果矢量需要增長,我會遇到指針錯誤。經過數小時的試圖找出發生了什麼,我相信我遇到了無效迭代器的問題。如何避免插入函數中的指針失效?

這裏是我的插入功能,並且儲備功能:

// Insert "item" before "pos", and return iterator referencing "item" 

iterator insert (iterator pos, const T& item) 
{ 

if (m_size == m_capacity) 
    { 
    reserve(m_capacity * 2); 
    } 

T * endOfArray = (end()); 

while (endOfArray != pos) 
    { 
    *(endOfArray) = *(endOfArray - 1); 
    --endOfArray; 
    } 
++m_size; 
*pos = item; 

return (pos); 
} 

void reserve (size_t space) { 
if (space < m_capacity) 
    { 
    return; 
    } 

T *temp_array = new T[space]; 

std::copy(begin(), end(), temp_array); 
m_array = new T[space]; 
std::copy(temp_array, (temp_array + m_size), m_array); 
m_capacity = space; 
delete [] temp_array; 
} 

正如你可以看到,如果插入函數調用有向量的容量增加,那麼「POS」迭代器無效。我怎樣才能解決這個問題?

+0

你看到了什麼錯誤?也請張貼保留和結束的代碼。 – madmik3 2010-10-03 21:09:21

+0

彼得亞歷山大得到了你的答案。關於後備職能只有一句話。您不需要臨時緩衝區和雙重複制。你可以創建新的緩衝區,複製數據,並設置m_array。 – Dialecticus 2010-10-03 21:30:21

回答

2

改變pos迭代器爲一個索引,而是使用它。

size_t index = pos - begin(); 
// do resize 
pos = begin() + index; 

如果您擔心迭代器通常會失效,請不要。這是不可避免的,至少在這種風格的動態數組中,和std::vector完全相同。

+0

謝謝你的回覆,彼得。你是說,而不是遍歷數組,我應該使用索引? – 2010-10-03 21:17:40

+0

@ user465367:您可以這樣做,或者您可以在重新分配之前將迭代器「存儲」爲索引,然後在執行實際插入之前將其「還原」爲迭代器。無論你喜歡什麼。 – 2010-10-03 21:19:14

+0

@user:看我的編輯。 – 2010-10-03 21:29:23