读写迭代器- c++
Read And Write Iterators - C++
我是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];
是的,我明白了:以学习为目的的宠物项目有价值,但是……我认为在许多其他领域,迭代器寻址比二维网格更有意义。
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?