2014-10-12 55 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