Короткий ответ, вам следует вызывать эту функцию, как только присваивается *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
.