2012-02-08 9 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

関連する問題