2012-02-08 84 views
3

我已經制作了一個稀疏矩陣列表實現列表,並且我已經實現了迭代器和const_iterator成功。通過迭代器檢查某些內容是否已更改的方法

的迭代器不直接指向當值存儲,而是創建一個結構,命名元素的容器,這樣定義:

template <typename T> 
struct element{ 
int i,j; //Coordinates 
T value; 
}; 

但是有一個問題迭代器:當我使用它要編輯結構中的值,這甚至應該影響矩陣的內部結構。 我認爲將原始值存儲在迭代器的其他私有屬性中,然後將它們與存儲在結構中的數據進行比較:如果有不同,我會調用矩陣的方法來編輯真實的內部結構。

我唯一想念的是:什麼時候在迭代器類中調用此方法的正確時機?

回答

3

簡短的回答,你應該儘快調用這個函數*it被分配到,其中it是一個迭代器。

我不認爲你有正確的做法。 C++中的迭代器無法真正緩存更改,因爲可能有其他迭代器指向容器中的相同位置。通過迭代器進行的更改應立即影響矩陣,矩陣中的更改應立即通過迭代器顯示。這是一個測試案例:

typedef whatever_type_you_like T; // maybe int 

matrix<T> mymatrix(5, 5); 
matrix<T>::iterator it1 = get_iterator_from(mymatrix, 2, 3); 
matrix<T>::iterator it2 = get_iterator_from(mymatrix, 2, 3); 
assert(it1 == it2); 
assert(*it1 == *it2); 
assert(*it1 == T()); 

*it1 = T(1); // or some other constructor parameter 
assert(*it1 != T()); 
assert(*it1 == T(1)); 
assert(*it2 == T(1)); 
assert(it1 == it2); 
assert(*it1 == *it2); 
assert(*it1 == mymatrix[2][3]); // or whatever syntax you have for matrix access 

*it2 = T(2); 
assert(*it1 != T(1)); 
assert(*it1 == T(2)); 
assert(*it2 == T(2)); 
assert(it1 == it2); 
assert(*it1 == *it2); 
assert(*it2 == mymatrix[2][3]); 

mymatrix[2][3] = T(3); 
assert(*it2 != T(2)); 
assert(*it2 == mymatrix[2][3]); 

因此,而不是element存儲用於矩陣的值的副本,就應該直接訪問矩陣,讀值從那裏和存儲值存在(並因此創造在需要存儲時在稀疏矩陣中的真實條目)。此外,您的element類應該可兌換爲T

+0

謝謝,這解決了我的問題! – Vektor88 2012-02-08 10:33:54

相關問題