什么是单通道算法

Nay*_*iya 2 c++ iterator stl

虽然我正在阅读有关STL迭代器的内容,但请参阅https://www.sgi.com/tech/stl/Iterators.html

最受限制的迭代器类型是输入迭代器和输出迭代器,它们都允许"单通"算法,但不一定支持"多次通过"算法.

  1. "单通道算法"的含义是什么?
  2. 上述句子的意思是什么?

rav*_*avi 6

Iinput-iterators是一次通过迭代器,即您只能迭代它们一次.而前向迭代器是多遍的.

另外,对于输入迭代器,a == b并不意味着++ a == ++ b.这意味着输入迭代器上的算法永远不应该尝试两次通过相同的迭代器.它们应该是单通道算法.

编辑给予更多澄清: -

输入迭代器是单遍迭代器: -

这意味着它们一次只能在列表中前进一个元素,并且一旦项目被迭代,它将永远不会再次迭代.例如,考虑一个迭代std :: cin的输入迭代器.它将一次返回一个字符,因为它们已在输入流中准备就绪,但您永远不能"返回"到流中的前一个字符.

前向迭代器是多遍迭代器: -

这意味着您可以"返回"前一个字符,但不能从迭代器对象本身执行此操作

forward_iterator iter = some_list.begin();
forward_iterator iter2 = iter;

item i = *iter;  // Legal, we're using a first pass

++iter;  // Legal, moving forward
--iter;  // Illegal!  It's a forward-only iterator

item i2 = *iter2;  // Legal, we're using a second pass to read an earlier item

For input iterator this would be illegal.
item i2 = *iter2;  //Illegal
Run Code Online (Sandbox Code Playgroud)

希望我很清楚......

  • 请阅读脚注1 [here](https://www.sgi.com/tech/stl/ForwardIterator.html):“ Input Iterator中描述的限制已被删除。增加正向迭代器不会使旧值的副本无效”。可以复制前向迭代器,并将该副本用于以后(例如,对单个链接列表中的节点的引用)。增加正向迭代器不会使它的其他副本无效。输入迭代器增加后,其他副本将无效,例如流的文件句柄。您可以复制正向迭代器,并使用副本进行数据的额外传递。 (2认同)

小智 6

我认为你的意思是一次性算法

单遍算法:该算法不需要多次访问容器中的某个项目(即容器中的所有项目仅读取或写入一次)。例如,在排序数组中查找某个元素以及在某些数据结构中查找第 n 个元素。

“多遍”算法:算法可能需要多次读取或写入一个项目。对于这些情况,您必须使用多遍迭代器,例如ForwardIteratorC ++ 中的 ,​​ , 另请参阅BidirectionalIteratorCPP参考上的迭代器RandomAccessIterator