读写迭代器- c++

Read And Write Iterators - C++

本文关键字:c++ 迭代器 读写      更新时间:2023-10-16

我是c++的新手(来自C和Java),想写一个简单的数独求解器作为练习。我正在考虑使用迭代器来迭代Sudoku字段的行/列/块,并阅读这个c++参考页面。

现在我有两个问题:

  • 对我来说,似乎存在两种迭代器:Input-(只读)/Output(只写)-迭代器和Input-迭代器(连续/随机访问/等)。如果我想迭代数独字段,我希望能够读取写入元素。我的迭代器应该扩展什么迭代器?

  • 我实际上认为我需要两个迭代器,一个迭代不同的行/列/块,一个迭代元素遍历这些行/列/块中的元素。这里常用的命名约定是什么?我正在考虑RowIterator迭代行,RowElementIterator迭代RowIterator指向的对象内包含的元素。

迭代器的结构与您想象的不同。RandomAccess迭代器可以同时具有输入和输出。即使是低级的正向迭代器也能做到这一点。

同样,这些不是真正的基类。相反,它们是迭代器类别。这意味着"InputIterator"类别完全包含"RandomAccess"类别。并非每个迭代器都允许写访问和/或随机访问,因此"OutputIterator"answers"RandomAccess"类别是正交的。

在你的例子中,所有的迭代器都可以是RandomAccess;没有真正的理由限制它们。没有明显的命名约定,也没有命名的真正原因。现在我们有了for (auto& row : board) { for (auto& cell : row) { ... } ... }

我可能错了,但我怀疑迭代器在解决数独问题上能给你多大帮助。

假设你将把你的迭代器(line, col, block)写成RandomAccess类型——允许"按范围操作符寻址",而不仅仅是增量寻址。作为"在线性容器中的当前位置"的抽象替代品,极简有效的随机访问迭代器不会提供"原始索引"。如果将迭代器的使用与直接使用位置索引进行比较,这就有点令人不快了:

"按行/col 迭代器导航"——如果你先按行迭代,然后按行内的颜色迭代得到一个位置,你将需要一个额外的步骤来完成"切换行但保持列"。代码中:

// go by row first, then by col inside the row
auto elemPos=board.row_iterator()[row].col_iterator()[col];
// now, keep the col, but switch the row
auto newPos=board.getColIterator(elemPos)[newRow];
//                ^ this is an extra operation 
//                  to perform the switch from row first
//                  to column first navigation

将上面的方法与"按索引寻址"进行比较-您有row/col位置,可以根据需要随意增加/减少两个中的任何一个

auto elem=board[row][col];
auto newElem=board[newRow][col];

是的,我明白了:以学习为目的的宠物项目有价值,但是……我认为在许多其他领域,迭代器寻址比二维网格更有意义。