虽然我正在阅读有关STL迭代器的内容,但在https://www.sgi.com/tech/stl/Iterators.html
中找到了此注释最受限制的迭代器类型是输入迭代器和输出迭代器,它们都允许"单通道"算法,但不一定支持" multi-pass"算法
答案 0 :(得分:5)
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
希望我很清楚...
答案 1 :(得分:3)
我认为你的意思是a one-pass algorithm。
一次通过算法:算法不需要多次访问容器中的项目(即容器中的所有项目只能读取或写入一次)。例如,在排序数组中查找某个元素并在某些数据结构中查找第n个元素。
<强>&#34;多遍&#34;算法:算法可能需要多次读取或写入项目。对于这些情况,您必须使用多遍遍历迭代器,例如C ++中的ForwardIterator
,BidirectionalIterator
,RandomAccessIterator
,另请参阅Iterators on CPP Reference。