2015-09-13 18 views
0

我试图找到如下问题的解决方案:提供了一个整数矩阵对某些元素的迭代器

假设我们已经实现了一个抽象数据类型“整数矩阵” (假设整数是存储在行中)。我们需要定义一个迭代器迭代器遍历矩阵的列,并且仅遍历矩阵的元素。

执行的folling代码:

Matrix M; 
... 
Matrix::iterator it; 
for(it = M.begin(); it != M.end();++it) 
cout << *it 

在基质上:

5 4 3 
2 1 2 
9 0 2 
8 9 1 

应产生2 8 4 0 2 2

我面临几个问题做。 首先,我想避免向class iterator提供有关正在迭代的矩阵的大量信息。提供矩阵的行数和列数是不可避免的吗? 二,解决方案在很大程度上取决于基体的内部表示,所以我会说我应该实现一个基本的迭代器遍历逐行...

你认为是解决这一问题的最佳解决方案? 我只需要关于矩阵和迭代器的表示以及函数开始,结束,运算符*,运算符++和运算符==

回答

0

的建议,而不用猜测您未指定哪些操作需要特别有效,它看起来是一个平坦的线性存储元素将是最好的。通过调用它的Matrix :: iterator(并使用begin()和end()),你已经暗示这是用于这个Matrix类的普通迭代器(不是一些奇怪的额外迭代器)。所以在矩阵中值得一些额外的内容来保持迭代器的轻量级。你可以使迭代器的数据内容仅仅是一个指针,所以在一个优化的编译中,迭代器本身只是一个指针。它不需要知道行数或列数或限制。要做到这一点,你需要在矩阵数据的极限处分配和初始化一个警卫位置,它必须保存一个偶数,end()必须是一个指向它的指针(包装在迭代器类中)。然后begin()可以简单地找到第一个偶数,迭代器的++可以简单地找到下一个偶数。

为了支持我们假设必须存在的其他操作(但您没有问过),Matrix本身必须知道列数。对于end()和其他操作,Matrix必须知道总大小(表示为行数或元素数或限制地址是否可以轻松转换为限制地址)。但是额外的信息最好保存在矩阵中,而不是复制到迭代器中。

相关问题