检查迭代器是否已更改某些内容的方法

时间:2012-02-08 09:44:31

标签: c++ iterator sparse-matrix

我已经创建了一个稀疏矩阵列表实现,并且我已经成功实现了iterator和const_iterator。

迭代器不直接指向存储值的容器,而是创建一个名为element的结构,如下定义:

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

但是迭代器存在一个问题:当我用它来编辑结构中的值时,这甚至会影响矩阵的内部结构。 我想将原始值存储在迭代器的其他私有属性中,然后将它们与存储在结构中的数据进行比较:如果有什么不同,我会调用矩阵的方法来编辑真实的内部结构。

我唯一想念的是:在迭代器类中调用此方法的时机是什么时候?

1 个答案:

答案 0 :(得分:3)

简短的回答,您应该在*it被分配给it后立即调用此函数,其中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]); 是迭代器。

我认为你没有正确的方法。 C ++中的迭代器无法真正缓存更改,因为可能有其他迭代器指向容器中的同一位置。通过迭代器进行的更改应立即影响矩阵,并且矩阵中的更改应立即通过迭代器可见。这是一个测试用例:

element

因此,而不是element存储用于矩阵的值的副本,它应该直接访问矩阵,从那里读取值并将值存储在那里(从而创建需要存储时稀疏矩阵中的实数条目)。此外,您的T课程应该可转换为{{1}}。