Метод проверки, если что-то было изменено через итератор - PullRequest
3 голосов
/ 08 февраля 2012

Я сделал реализацию списка списков разреженной матрицы, и я успешно реализовал итератор и const_iterator.

Итератор не указывает непосредственно на контейнер, в котором хранится значение, носоздает структуру с именованным элементом, определенную таким образом:

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

Но есть одна проблема с итератором: когда я использую его для редактирования значений в структуре, это должно даже влиять на внутреннюю структуру матрицы.Я думал сохранить исходные значения в других закрытых атрибутах итератора, а затем сравнить их с данными, хранящимися в структуре: если что-то не так, я бы вызвал методы матрицы для редактирования реальной внутренней структуры.

Единственное, что мне не хватает: когда подходящий момент для вызова этого метода внутри класса итератора?

1 Ответ

3 голосов
/ 08 февраля 2012

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

...