2014-10-12 79 views
1

,而我阅读有关STL迭代器,这说明在https://www.sgi.com/tech/stl/Iterators.html什么是单遍算法

迭代器的最受限的排序是输入迭代器和输出迭代,这两者都允许“单通”找到算法,但不一定支持“多遍”算法。

  1. 什么是“单通道算法”的平均
  2. 什么上面这句话的平均
+0

单程==一次通过 - > https://en.wikipedia.org/wiki/One-pass_algorithm – halex 2014-10-12 04:58:56

回答

5

Iinput,迭代器是一个通迭代器,即你可以在他们重复一次。而前向迭代器是多遍的。

另外,对于输入迭代器,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 

这样做希望我很清楚...

+0

你是什么意思?'你可以迭代它们只有一次'。因为那些只能用于前进的旅行?正如我所知'前向迭代器'也不能用于双向旅行。那么为什么'前向迭代器'是'多次传递'呢? – 2014-10-12 05:09:04

+1

请阅读脚注1 [here](https://www.sgi.com/tech/stl/ForwardIterator.html):“输入迭代器中描述的限制已被删除。增加前向迭代器不会使旧的副本无效值。“一个前向迭代器可以被复制,后面的副本可以用于例如一个链接列表中的一个节点的引用,递增一个前向迭代器不会使其它副本无效,一旦输入迭代器递增,其他副本会变得无效,例如一个文件处理一个流,你可以复制前向迭代器,并使用副本进行数据的额外传递。 – lmz 2014-10-12 05:18:03

1

我想你的意思是a one-pass algorithm

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

“多遍”算法:算法可能需要多次读取或写入一个项目。对于这些情况,您必须在C++中使用多遍迭代器,例如ForwardIterator,BidirectionalIterator,RandomAccessIterator,另请参阅Iterators on CPP Reference