我已经完成了稀疏矩阵的Lists列表实现,并且成功实现了Iterator和const_iterator。
迭代器不直接指向存储值的容器,而是创建一个结构,命名为element,因此定义如下:
template <typename T>
struct element{
int i,j; //Coordinates
T value;
};
但是迭代器有一个问题:当我使用它来编辑结构中的值时,这甚至会影响矩阵的内部结构。
我想将原始值存储在迭代器的其他私有(private)属性中,然后将它们与存储在结构中的数据进行比较:如果有所不同,我将调用矩阵的方法来编辑真正的内部结构。
我唯一想念的是:什么时候在iterator类中调用此方法?
最佳答案
简短的答案是,您应该在分配了*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
。关于c++ - 检查是否已通过迭代器更改某些内容的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9190813/