c++ - 通过迭代器检查某些内容是否已更改的方法

标签 c++ iterator sparse-matrix

我已经实现了一个稀疏矩阵的列表列表实现,并且成功实现了迭代器和常量迭代器。

迭代器并不直接指向存储值的容器,而是创建一个结构体,命名元素,如此定义:

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

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

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

最佳答案

简而言之,您应该在 *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 类应该可以转换为 T

关于c++ - 通过迭代器检查某些内容是否已更改的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9190813/

相关文章:

Mongodb稀疏索引和普通索引

c++ - 不确定如何为 MinGW 构建 OpenCV

php - 使用 SPL ArrayObject、ArrayIterator、RecursiveArrayIterator 而不是常规数组有什么好处?

c++ - 类指针类和 ->* 运算符

python - 有没有一种优雅的方法可以通过迭代循环 N 次列表(如 itertools.cycle 但限制循环)?

python - 将 python 稀疏矩阵导入 MATLAB

r - 将 dgCMatrix 转换为逻辑矩阵

c++ - 弯路 - jmp 00000000

c++ - 在Mac OS Catalina中将--std = C++ 17设置为默认值

c++ - 为什么我的 QBoxLayouts 不工作?