2009-08-03 117 views
1

我不知道如何和爲什麼這段代碼的工作:這段C++代碼在做什麼?

// postorder dfs 
Iterator< Index<String<char> >, TopDown<ParentLink<Postorder> > >::Type 
    myIterator(myIndex); 
while (goDown(myIterator)); 
for (; !atEnd(myIterator); goNext(myIterator)) 
// do something with myIterator (Traverse Through (Suffix)-tree) 

這是一個從seqan一個例子,接口描述如下:API

  1. 的同時,如何能影響換循環?
  2. 爲什麼不初始化for循環?
+1

這裏沒有涉及元編程。並非所有模板的使用都是元編程。 – 2009-08-03 16:19:52

回答

18

您已經遇到了C++的有趣部分 - 在語法上有效但難於解析人類語法的技術中使用語言結構。

while (goDown(myIterator)); 

這將「goDown(myIterator)」,直到它返回false。然後它將繼續進入for循環。它沒有任何循環 - 但沒關係,因爲函數goDown正在工作。

for (; !atEnd(myIterator); goNext(myIterator)) 

這不初始化任何東西,但經過檢查,它不是atEnd(myIterator) - 雖然它不是,它會goNext(myIterator)。它也可以被寫成while循環,使其slghtly更容易理解:

while(!atEnd(myIterator)) 
{ 
    goNext(myIterator)); 
} 

因此,代碼將:

  1. 下去,直到倉庫()返回false - 這意味着倉庫正在修改myIterator每次
  2. goNext(),直到它是atEnd()
4

顯然,goDowngoNext正在通過引用和改變他們的說法它。所以你的兩個問題的答案是:1. while多次調用goDown,改變myIterator,因爲它是你所談論的間接影響,因爲2. for開始於myIterator正如while離開它 - 當然,它不會重新分配它,這將消除所有的時間的工作!